Java 我们可以在lookback表达式中使用量词吗?

Java 我们可以在lookback表达式中使用量词吗?,java,regex-lookarounds,Java,Regex Lookarounds,这个问题是针对Java7/8的 使用量词的相当复杂的正则表达式在lookbehind断言中是被禁止的,例如: (?<=(a|b*)*)bc (?<=x(abc)*)bc // succeeds 我猜这是因为像*和+这样的量词“通常”是不允许的 但是,以下方法确实有效: (?<=a*)bc (?在查看了模式并试图跟踪它之后,我确信这只是一个bug。这两个示例都应该导致一个异常。但是测试该异常的逻辑是不正确的 此代码出现在以下几个位置: temp = info.max

这个问题是针对Java7/8的

使用量词的相当复杂的正则表达式在lookbehind断言中是被禁止的,例如:

(?<=(a|b*)*)bc
(?<=x(abc)*)bc    // succeeds
我猜这是因为像
*
+
这样的量词“通常”是不允许的

但是,以下方法确实有效:

(?<=a*)bc

(?在查看了
模式并试图跟踪它之后,我确信这只是一个bug。这两个示例都应该导致一个异常。但是测试该异常的逻辑是不正确的

此代码出现在以下几个位置:

 temp = info.maxLength * cmax + maxL;
 info.maxLength = temp;
 if (temp < maxL) {
     info.maxValid = false;
 }
因为带量词的模式的长度为1,并且
a*
之前没有任何内容,这意味着
maxL
将为0。这就是为什么这个案例会出现裂缝

对于任何其他值,计算将溢出,但这并不一定意味着
temp
将为真。如果
info.maxLength
为偶数,则将引发异常;但如果
info.maxLength
为奇数,则在
maxL
足够小的情况下将编译模式。这是因为环绕方式从数学上讲是有效的;尝试检查溢出的代码是非常错误的

(?<=a*)bc         // succeeds
(?<=(ab)*)bc      // throws exception
(?<=(abc)*)bc     // succeeds
(?<=(abcd)*)bc    // throws exception
(?<=(abcde)*)bc   // succeeds
相当于

(?<=a)bc
因为在这里,匹配器确实必须向后查找字符串中的
abc
,并确保最后一个字符串前面有
x
。在这种情况下,
模式
似乎应该抛出异常,但由于溢出检查逻辑错误,它不是。因此,我不确定它是否会实际返回正确的结果,或者它是否可能崩溃或进入无限循环。但是,我没有尝试过


实际上,代码应该直接检查
cmax
是否等于
Integer.MAX\u VALUE
,而不是在计算中使用它,并希望代码稍后可以判断结果是假的。

(注意:这不是JLS指定的,而是库文档指定的。)也没有具体说明。它指的是一本描述具体行为的O'Reilly书。谢谢。我已经做了更正。
(?<=xa*)bc        // throws exception
(?<=x(abc)*)bc    // succeeds
(?<=a*)bc
(?<=a+)bc
(?<=a)bc
(?<=x(abc)*)bc    // succeeds