18

我收到此错误:

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

我正在尝试匹配COFFEE,但不是BOBBEE

我正在使用java 1.6。

4

3 回答 3

19

为避免此错误,您应该替换+为以下区域{0,10}

([a-z])(?!.*\1)(?<!\1.{0,10})([a-z])(?!.*\2)(?<!\2.{0,10})(.)(\3)(.)(\5)
于 2011-12-13T03:16:27.280 回答
13

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

([a-z])(?!.*\1)([a-z])(?!.*\2)(.)(\3)(.)(\5)

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

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

于 2011-09-25T05:12:27.767 回答
5

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

从这里复制

于 2014-05-30T03:14:42.117 回答