我在使用 JBehave 库时遇到了一些问题,他们归结为正则表达式将我的 JRE 与 CPU 工作相结合。
表达式是(.*?)?(\{((.*?)(\|)?)*?\})(.*)
并且我正在匹配它create entity of type $entityType {set properties $propertyNames to values $propertyValues
- 注意未闭合的大括号。
有没有办法优化上述表达式或优雅地解决它?
这不是它循环,而是它远非快速失败。原因是这部分:
((.*?)(\|)?)*?
*?
第一个和第二个应该匹配什么?如果失败,正则表达式引擎必须回退以尝试所有组合。(嗯,不是 DFA 引擎,但 Java 正则表达式引擎是 NFA)
现在,您需要告诉这个正则表达式应该匹配什么,以便可以编写一个理智的正则表达式。
顺便说一句,这就是为什么惰性量词很烂的原因。
试试这个做同样事情的模式(使用相同的捕获):
([^\n{]*+)(\{(([^|}]++)(\|)?+)*+\})([^\n]*+)
这里的想法是尽可能快地失败。这就是为什么我通过使用所有格量词约束字符类来替换惰性量词的原因。
但是既然你没有给出这个的最终目标,我就不能给你更好的模式。