我正在尝试在 Java 中创建一个正则表达式来匹配特定单词的模式以查找具有相同模式的其他单词。例如,单词“tooth”具有模式 12213,因为 't' 和 'o' 都重复。我希望正则表达式匹配“牙齿”等其他词。
所以这是我使用反向引用的尝试。在此特定示例中,如果第二个字母与第一个字母相同,则它应该失败。此外,最后一个字母应该与其他字母不同。
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());
如果我删除最后一组,我已经验证它适用于像“嘟嘟”这样的例子,即以下,所以我知道反向引用正在工作到这一点:
String regex = ([a-z])([a-z&&[^\1]])\\2\\1";
但是,如果我将最后一组添加回模式的末尾,就好像它不再识别方括号内的反向引用。
我做错了什么,还是这是一个错误?