特定の単語のパターンに一致する正規表現を Java で作成して、同じパターンを持つ他の単語を見つけようとしています。たとえば、「tooth」という単語は、「t」と「o」の両方が繰り返されるため、パターン 12213 を持ちます。正規表現を「歯」などの他の単語と一致させたいと思います。
これが後方参照を使用した私の試みです。この特定の例では、2 番目の文字が最初の文字と同じ場合、失敗するはずです。また、最後の文字は他のすべての文字とは異なる必要があります。
String regex = "([a-z])([a-z&&[^\1]])\\2\\1([a-z&&[^\1\2]])";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher("tooth");
//This works as expected
assertTrue(m.matches());
m.reset("tooto");
//This should return false, but instead returns true
assertFalse(m.matches());
最後のグループ、つまり次のグループを削除すると、「toot」のような例で機能することを確認したので、この時点まで後方参照が機能していることがわかります。
String regex = ([a-z])([a-z&&[^\1]])\\2\\1";
しかし、パターンの最後に最後のグループを追加すると、角括弧内の後方参照が認識されなくなります。
私は何か間違ったことをしていますか、それともこれはバグですか?