我在使用JBehave库时出现了一些问题,他们认为正则表达式使我的JRE在CPU工作中陷入困境。
表达式为(.*?)?(\{((.*?)(\|)?)*?\})(.*)
,我将其与create entity of type $entityType {set properties $propertyNames to values $propertyValues
匹配 - 请注意未闭合的花括号。
有没有办法优化上面的表达式或优雅地解决它?
答案 0 :(得分:2)
这不是它循环,而是它远没有快速失败。原因是这部分:
((.*?)(\|)?)*?
第一个*?
和第二个应该匹配什么?如果失败,正则表达式引擎必须反向尝试所有组合。 (好吧,不是DFA引擎,但Java正则表达式引擎是NFA)
现在,你需要告诉这个正则表达式应该匹配什么,这样才能写出正确的正则表达式。
顺便说一下,这就是为什么懒惰量词会吮吸的原因。
答案 1 :(得分:2)
尝试这种做同样事情的模式(使用相同的捕获):
([^\n{]*+)(\{(([^|}]++)(\|)?+)*+\})([^\n]*+)
这里的想法是尽快失败。这就是为什么我通过用占有量词来约束字符类来取代惰性量词。
但既然你没有给出最终目标,我就不能给你一个更好的模式。