正则表达式抛出StackOverFlow错误

时间:2010-09-19 17:35:39

标签: java regex

我有一个简单的正则表达式问题。我有以下多行字符串:

description: line1\r\nline2\r\n...

我正试图找到description:之后的所有行。我使用了以下正则表达式(还有更多):

description: ((.*\r\n){1,})

......没有任何成功。然后我发现在Sun中有一个'Regexp StackOverflow'错误(声明不会修复),请参阅Bug #5050507。任何人都可以请我提供神奇的公式来克服这个烦人的错误吗?请注意,线路的总长度必须超过818字节!!

2 个答案:

答案 0 :(得分:1)

由于您要匹配文字description以外的任何内容,因此您只需将该点与Pattern.DOTALL的新行匹配即可:

description:\s(.*)

所以,在Java中:

Pattern regex = Pattern.compile("description:\\s(.*)", Pattern.DOTALL);
Matcher regexMatcher = regex.matcher(subjectString);
if (regexMatcher.find()) {
    ResultString = regexMatcher.group(1);
}

你的正则表达式的唯一语义差异(除了它不会破坏你的堆栈的事实之外)是,如果description:之后的任何内容不包含换行符,它也会匹配。此外,你的正则表达式将不会匹配文件的最后一行,除非它以换行符结束,我的意思。您的决定更适合哪种行为。

当然,您的功能可以这样模仿:

description:\s(.*\r\n)

但我怀疑那真的是你想要的。或者是吗?

答案 1 :(得分:0)

我可以重现错误:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; ++i)
{
    sb.append("j\r\n");
}
String s = "description: " + sb.toString(); 
Pattern pattern = Pattern.compile("description: ((.*\r\n){1,})");
//Pattern pattern = Pattern.compile("description: ((?:.*\r\n)++)");

Matcher matcher = pattern.matcher(s);
boolean b = matcher.find();
if (b) {
    System.out.println(matcher.group(1));
}

量词{1,}+相同,因此您应该使用+,但这仍然失败。要解决这个问题,你可以(正如Bat K.指出的那样)将+更改为++,使其占有,从而禁用回溯,防止堆栈溢出。