【问题标题】:Java regex error - Look-behind group does not have an obvious maximum lengthJava 正则表达式错误 - 后视组没有明显的最大长度
【发布时间】:2011-09-25 04:59:03
【问题描述】:

我收到此错误:

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。

【问题讨论】:

    标签: java regex lookbehind


    【解决方案1】:

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

    ([a-z])(?!.*\1)(?<!\1.{0,10})([a-z])(?!.*\2)(?<!\2.{0,10})(.)(\3)(.)(\5)
    

    【讨论】:

    • 我正在使用这个 (?
    • 总的来说,这是一种肮脏的解决方法,但是是的,如果保证片段不会太长,只需将 + 替换为 {1,999} 之类的东西就可以了。
    • 请注意,如果您要替换 +,您应该从 1 开始,而不是 0。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 在正则表达式后面的样子中说 Java 不支持“可变长度”可能是不正确的。例如,以下工作:(?&lt;=(a*))afs
    【解决方案3】:

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

    复制自Here

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2014-09-12
      相关资源
      最近更新 更多