java 超大文件 正则_正则表达式在Java中没有明显的最大长度

我一直认为,Java的regex-API(以及与此相关的许多其他语言)中的后置断言必须具有明显的长度。因此,look-behinds内不允许使用STAR和PLUS量词。

出色的在线资源regular-expressions.info似乎证实了我的一些假设:

“ [...] Java通过允许有限重复而向前迈进了一步。您仍然不能使用星号或加号,但是可以使用问号和带有大括号的花括号来指定最大参数。Java认识到有限重复的事实可以重写为具有不同但固定长度的字符串的替换。不幸的是,当您在后向内部使用替换时,JDK 1.4和1.5会出现一些错误。这些错误已在JDK 1.6中修复。[...]“

- http://www.regular-expressions.info/lookaround.html

只要大括号内的字符的范围的总长度小于或等于Integer.MAX_VALUE,就可以使用大括号。因此,这些正则表达式有效:

"(?<=a{0,"   +(Integer.MAX_VALUE)   + "})B"

"(?<=Ca{0,"  +(Integer.MAX_VALUE-1) + "})B"

"(?<=CCa{0," +(Integer.MAX_VALUE-2) + "})B"

但是这些不是:

"(?<=Ca{0,"  +(Integer.MAX_VALUE)   +"})B"

"(?<=CCa{0," +(Integer.MAX_VALUE-1) +"})B"

但是,我不了解以下内容:

当我在后面的内部使用*和+量词运行测试时,一切运行良好(请参阅输出Test 1和Test 2)。

但是,当我在的开头添加一个字符向后看,从测试1和测试2,它打破(见输出测试3)。

使来自测试3的贪婪* 勉强没有效果,但它仍然会中断(请参阅测试4)。

这是测试工具:

public class Main {

private static String testFind(String regex, String input) {

try {

boolean returned = java.util.regex.Pattern.compile(regex).matcher(input).find();

return "testFind       : Valid   -> regex = "+regex+", input = "+input+", returned = "+returned;

} catch(Exception e) {

return "testFind       : Invalid -> "+regex+", "+e.getMessage();

}

}

private static String testReplaceAll(String regex, String input) {

try {

String returned = input.replaceAll(regex, "FOO");

return "testReplaceAll : Valid   -> regex = "+regex+", input = "+input+", returned = "+returned;

} catch(Exception e) {

return "testReplaceAll : Invalid -> "+regex+", "+e.getMessage();

}

}

我的问题可能很明显,但我仍然会问:有人可以向我解释为什么测试1和2失败,而测试3和4失败吗?我本以为他们都会失败,而不是一半会工作,一半会失败。

谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值