处理大型输入数据时出现StackOverflow错误

时间:2019-08-28 13:55:48

标签: java regex stack-overflow regex-lookarounds

使用RegEx模式匹配结果时出现StackOverflowError

我已经检查了其他帖子是否存在同类问题,但无法相应地修改我的正则表达式

这是引起问题的我的正则表达式

private static final Pattern comment = Pattern.compile("\\/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/[\n\r]*",
        Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4250)
    at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3777)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4279)
    at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4272)
    at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3777)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4279)
    at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4272)
    at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3777)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4279)
    at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4272)
    at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3777)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4279)
    at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4272)
    at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3777)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4279)
    at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4272)
    at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3777)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)


1 个答案:

答案 0 :(得分:0)

您的模式写得不是特别糟糕,但是您可以对其进行改进以限制回溯:

private static final Pattern comment = Pattern.compile("/\\*(?:\\**[^/*][^*]*)*+\\*+/[\n\r]*");

这两个选项没有用(dotall,不区分大小写)。我删除了奇怪的[^*]*\\*+,并在其有用时使量词成为所有格。

此模式是以手动方式编写的,可以快速到达星号。


由于您的字符串不太长,所以类似:

private static final Pattern comment = Pattern.compile("\Q/*\E .*? \Q*/\E [\n\r]*", Pattern.DOTALL | Pattern.COMMENTS);

也应该起作用。

此模式更短,更易读,但由于非贪婪的量词需要更多测试,因此最终会变慢。