我有一个简单的正则表达式问题。我有以下多行字符串:
description: line1\r\nline2\r\n...
我正试图找到description:
之后的所有行。我使用了以下正则表达式(还有更多):
description: ((.*\r\n){1,})
......没有任何成功。然后我发现在Sun中有一个'Regexp StackOverflow'错误(声明不会修复),请参阅Bug #5050507。任何人都可以请我提供神奇的公式来克服这个烦人的错误吗?请注意,线路的总长度必须超过818字节!!
答案 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.指出的那样)将+
更改为++
,使其占有,从而禁用回溯,防止堆栈溢出。