正则表达式匹配卡住了我的JVM

时间:2013-06-08 22:20:22

标签: java regex loops

我在使用JBehave库时出现了一些问题,他们认为正则表达式使我的JRE在CPU工作中陷入困境。

表达式为(.*?)?(\{((.*?)(\|)?)*?\})(.*),我将其与create entity of type $entityType {set properties $propertyNames to values $propertyValues匹配 - 请注意未闭合的花括号。

有没有办法优化上面的表达式或优雅地解决它?

2 个答案:

答案 0 :(得分:2)

这不是它循环,而是它远没有快速失败。原因是这部分:

((.*?)(\|)?)*?

第一个*?和第二个应该匹配什么?如果失败,正则表达式引擎必须反向尝试所有组合。 (好吧,不是DFA引擎,但Java正则表达式引擎是NFA)

现在,你需要告诉这个正则表达式应该匹配什么,这样才能写出正确的正则表达式。

顺便说一下,这就是为什么懒惰量词会吮吸的原因。

答案 1 :(得分:2)

尝试这种做同样事情的模式(使用相同的捕获):

([^\n{]*+)(\{(([^|}]++)(\|)?+)*+\})([^\n]*+)

这里的想法是尽快失败。这就是为什么我通过用占有量词来约束字符类来取代惰性量词。

但既然你没有给出最终目标,我就不能给你一个更好的模式。