Java正则表达式错误-查找组没有明显的最大长度
我得到这个错误:Java正则表达式错误-查找组没有明显的最大长度,java,regex,lookbehind,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) ^ java.util.regex.PatternSyntaxEx
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)
^
java.util.regex.PatternSyntaxException:查找隐藏组没有
指数22附近的明显最大长度
([a-z])(?!.\1)(?)?
我正在尝试匹配咖啡
,但不是博比
我使用的是java 1.6。java不支持look behind中的可变长度。
在这种情况下,您似乎可以轻松忽略它(假设您的整个输入是一个单词):
两个lookbehind都没有添加任何内容:第一个声明至少有两个字符,其中您只有一个,第二个检查第二个字符是否与第一个不同,而第一个字符已包含在(?!.\1)
中
工作示例:若要避免此错误,应将+
替换为类似{0,10}
的区域:
([a-z])(?!.*\1)(?<!\1.{0,10})([a-z])(?!.*\2)(?<!\2.{0,10})(.)(\3)(.)(\5)
([a-z])(?!.\1)(?)?
Java允许有限的重复,使事情更进一步。您仍然不能使用星号或加号,但可以使用问号和大括号,并指定max参数。Java确定lookback的最小和最大可能长度。
regex(?有6个可能的长度。长度可以在7到11个字符之间。当Java(版本6或更高版本)尝试匹配lookback时,它首先返回最小字符数(本例中为7个字符)在字符串中,然后像往常一样从左到右计算lookback中的正则表达式。如果失败,Java将后退一个字符并重试。如果lookback继续失败,Java将继续后退,直到lookback匹配或后退到最大字符数为止(本例中为11)。当lookbehind的可能长度增加时,这种在主题字符串中重复的后退会降低性能。请记住这一点。不要选择任意大的最大重复次数来解决lookbehind中缺少无限量词的问题。Java 4和5存在导致lookbehind的错误,可以交替使用o当变量量词在某些情况下应该成功时,它会失败
抄袭自我使用的是这个(?总的来说,这是一种肮脏的解决方法,但是是的,如果作品保证不会太长,就用类似于{1999}的东西替换+
工作正常。请注意,如果要替换+
,则应从最小值1开始,而不是从0开始。如果说Java在look-behind regex中不支持“可变长度”,可能是不正确的。例如,以下工作:(?)?
([a-z])(?!.*\1)(?<!\1.{0,10})([a-z])(?!.*\2)(?<!\2.{0,10})(.)(\3)(.)(\5)