我正在尝试在Java中创建一个正则表达式,以匹配特定单词的模式,以查找具有相同模式的其他单词。例如,单词“tooth”的模式为12213,因为't'和'o'都重复了。我希望正则表达式能够匹配像“teeth”这样的单词。
以下是我的尝试,使用反向引用。在这个特定的例子中,如果第二个字母与第一个字母相同,则应该失败。此外,最后一个字母应该与所有其他字母不同。
以下是我的尝试,使用反向引用。在这个特定的例子中,如果第二个字母与第一个字母相同,则应该失败。此外,最后一个字母应该与所有其他字母不同。
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";
但是如果我将最后一组添加回模式的末尾,就好像方括号内的反向引用不再被识别。
我是做错了什么,还是这是一个bug?