正则表达式在Java中没有明显的最大长度

正则表达式在Java中没有明显的最大长度,java,regex,Java,Regex,我一直认为Java的正则表达式API(以及许多其他语言)中的look-behind断言必须具有明显的长度。所以,星号和加号量词不允许在后面看 优秀的在线资源似乎证实了我的一些假设: “[…]Java更进一步 允许有限的重复。你仍然 不能使用星号或加号,但您 可以使用问号和 带有max参数的花括号 Java可以识别这个事实 这种有限的重复可以是 重写为字符串的交替 具有不同但固定的长度。 不幸的是,JDK1.4和1.5 使用时会出现一些错误 交替内窥。这些 已在JDK 1.6中修复。[…]” --

我一直认为Java的正则表达式API(以及许多其他语言)中的look-behind断言必须具有明显的长度。所以,星号和加号量词不允许在后面看

优秀的在线资源似乎证实了我的一些假设:

“[…]Java更进一步 允许有限的重复。你仍然 不能使用星号或加号,但您 可以使用问号和 带有max参数的花括号 Java可以识别这个事实 这种有限的重复可以是 重写为字符串的交替 具有不同但固定的长度。 不幸的是,JDK1.4和1.5 使用时会出现一些错误 交替内窥。这些 已在JDK 1.6中修复。[…]”

--

只要“后视”中字符范围的总长度小于或等于Integer.MAX_值,则使用花括号即可。因此,这些正则表达式是有效的:

"(?<=a{0,"   +(Integer.MAX_VALUE)   + "})B"
"(?<=Ca{0,"  +(Integer.MAX_VALUE-1) + "})B"
"(?<=CCa{0," +(Integer.MAX_VALUE-2) + "})B"
”(?regex=“+regex+”,input=“+input+”,returned=“+returned;
}捕获(例外e){
返回“testFind:Invalid->”+regex+,“+e.getMessage();
}
}
私有静态字符串testReplaceAll(字符串正则表达式、字符串输入){
试一试{
返回的字符串=input.replaceAll(regex,“FOO”);
return“testReplaceAll:Valid->regex=“+regex+”,input=“+input+”,returned=“+returned;
}捕获(例外e){
返回“testReplaceAll:Invalid->”+regex+,“+e.getMessage();
}
}
私有静态字符串testSplit(字符串正则表达式、字符串输入){
试一试{
字符串[]返回=input.split(regex);
return“testSplit:Valid->regex=“+regex+”,input=“+input+”,returned=“+java.util.array.toString(返回);
}捕获(例外e){
返回“testSplit:Invalid->”+regex+,“+e.getMessage();
}
}
公共静态void main(字符串[]args){

String[]regexes={”(?浏览Pattern.java的源代码,发现“*”和“+”是作为Curly的实例实现的(这是为Curly操作符创建的对象)

实现为

a{0,0x7FFFFFFF}
a{1,0x7FFFFFFF}

实现为

a{0,0x7FFFFFFF}
a{1,0x7FFFFFFF}
这就是为什么你看到卷发和星星的行为完全相同。

这是一个错误:


Pattern.compile()
如果无法确定查找后匹配的最大可能长度,则通常会引发异常。

我没有想到要查看模式的源代码……我真傻。谢谢!现在这很有道理。没有Eclipse我活不下去的原因之一是我的手指发痒,不能按ctrl键(如果不使用Eclipse,这意味着“打开定义此名称的源文件”)。谢谢,我从来没有费心将源文件附加到Eclipse。我现在肯定会这样做。谢谢。嘿,艾伦,我想你很快就会来的!谢谢,我知道这曾经是一个bug(在1.5中)但我记得引擎的计算结果总是错误的。现在它确实正确地计算了结果,所以我认为错误在1.6中得到了修复。我一定是记错了。谢谢你提供的信息。巴特(又名普罗米修兹)修复了错误;这是在1.6中引入的一个新错误。:/啊,太好了:|。谢谢你提供的信息。
a{0,0x7FFFFFFF}
a+
a{1,0x7FFFFFFF}