Java正则表达式错误 – 后瞻组没有明显的最大长度

我收到此错误:

java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index 22 ([az])(?!.*\1)(?<!\1.+)([az])(?!.*\2)(?<!\2.+)(.)(\3)(.)(\5) ^ 

我想要匹配COFFEE ,但不是BOBBEE

我正在使用java 1.6。

Java不支持后面的变量长度。
在这种情况下,您似乎可以轻松忽略它(假设您的整个输入是一个单词):

 ([az])(?!.*\1)([az])(?!.*\2)(.)(\3)(.)(\5) 

两个lookbehinds都没有添加任何东西:第一个断言至少两个字符,你只有一个,第二个字符检查第二个字符与第一个字符不同,它已被(?!.*\1)覆盖。

工作示例: http : //regexr.com?2up96

要避免此错误,您应该将+替换为{0,10}类的区域:

 ([az])(?!.*\1)(? 

Java通过允许有限重复更进一步。 您仍然无法使用星号或加号,但您可以使用问号和带有指定max参数的花括号。 Java确定了lookbehind的最小和最大可能长度。
正则表达式中的后视(?有6种可能的长度。 它可以是7到11个字符长。 当Java(版本6或更高版本)尝试匹配lookbehind时,它首先返回字符串中的最小字符数(本例中为7),然后像往常一样从左到右评估lookbehind内的正则表达式。 如果失败,Java会再退一个字符并再次尝试。 如果lookbehind继续失败,Java继续退回,直到lookbehind匹配或者它已经退回最大字符数(在本例中为11)。 当后视镜的可能长度数增加时,重复踩回主题弦会导致性能下降。 记住这一点。 不要选择任意大的最大重复次数来解决lookbehind中缺少无限量词的问题。 Java 4和5有一些错误,当它在某些情况下成功时会导致交替或变量量词的后观失败。 这些错误在Java 6中得到修复。

这里复制