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)