有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正则表达式匹配Stuck my JVM

我在JBehave库上遇到了一些问题,他们归结为正则表达式在我的JRE上用CPU工作

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

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


共 (1) 个答案

  1. # 1 楼答案

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

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

    第一个*?和第二个应该匹配什么?如果出现故障,正则表达式引擎必须回溯以尝试所有组合。(不是DFA引擎,而是Java正则表达式引擎NFA)

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

    顺便说一句,这就是为什么懒惰的量词很糟糕