use*_*263 16 java regex lookbehind
我收到此错误:
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)
^
Run Code Online (Sandbox Code Playgroud)
我想要匹配COFFEE,但不是BOBBEE.
我正在使用java 1.6.
小智 17
要避免此错误,您应该替换+为以下区域{0,10}:
([a-z])(?!.*\1)(?<!\1.{0,10})([a-z])(?!.*\2)(?<!\2.{0,10})(.)(\3)(.)(\5)
Run Code Online (Sandbox Code Playgroud)
Java不支持后面的变量长度.
在这种情况下,您似乎可以轻松忽略它(假设您的整个输入是一个单词):
([a-z])(?!.*\1)([a-z])(?!.*\2)(.)(\3)(.)(\5)
Run Code Online (Sandbox Code Playgroud)
两个lookbehinds都没有添加任何东西:第一个断言至少两个字符,你只有一个,第二个字符与第一个字符不同,第一个字符已经被覆盖了(?!.*\1).
工作示例:http://regexr.com?2up96
Java 通过允许有限重复使事情更进一步。您仍然不能使用星号或加号,但您可以使用带有指定 max 参数的问号和花括号。Java 确定了lookbehind 的最小和最大可能长度。
正则表达式中的回顾(?<!ab{2,4}c{3,5}d)test有 6 种可能的长度。它的长度可以在 7 到 11 个字符之间。当 Java(版本 6 或更高版本)尝试匹配 lookbehind 时,它首先退回字符串中的最少字符数(在本例中为 7),然后像往常一样从左到右评估lookbehind 中的正则表达式。如果失败,Java 会再退回一个字符并重试。如果后视继续失败,Java 将继续后退,直到后视匹配或后退最大字符数(在本例中为 11)。当lookbehind的可能长度的数量增加时,这种重复的回退主题字符串会降低性能。记住这一点。不要选择任意大的最大重复次数来解决lookbehind内部缺少无限量词的问题。Java 4 和 Java 5 存在一些错误,这些错误会导致在某些情况下应该成功时使用交替或变量量词的后视失败。这些错误已在 Java 6 中修复。
从这里复制
| 归档时间: |
|
| 查看次数: |
15425 次 |
| 最近记录: |