表达式中多个连续的。*会导致匹配缓慢

时间:2016-10-20 15:19:17

标签: regex java-7

我注意到如果我使用正则表达式 .*.*text.*.*,匹配所需的时间比.*text.*

上匹配时长得多

您可能已经猜到,使用双.*.*的正则表达式(意外地)是由软件生成的。

所以有两个问题:

  1. 我打算在运行匹配之前将.*.*替换为.*。我可以随时将.*.*替换为.*吗?是否存在.*.*在正则表达式中功能上不等.*的情况?

  2. 任何人都可以用简单的方式解释为什么需要花费更长的时间来匹配.*.*

  3. 如果这是一个特定于实现的行为,我使用的是Java 7的正则表达式引擎。

2 个答案:

答案 0 :(得分:3)

在匹配方面,.*.* 等效.*。在性能方面,您将节省大量时间。你应该学习回溯。

您可以看到.*.*Donec.*.*.*Donec.*之间的步骤编号从 101 897 变为 604 ,而Lorem的前两段存有。

答案 1 :(得分:0)

两个正则表达式.*.*.*在数学上完全相同。如果它们以相同的速度不匹配,则归因于编译和匹配时使用的实现。

如果你使用一个好的正则表达式编译器,你将获得一次通过,没有回溯算法只能探索匹配字符串的每个字符一次,处理O[n]算法,与常规的复杂性无关你使用的表达方式。

顺便说一句,绝大多数语言(perl,java,php等)中使用的所有当前实现都源于对匹配字符串的有限NFA(非确定性有限自动机)的直接解释。但是,如果您阅读Compilers, Principles, Techniques and Tools中描述的算法,您会发现只能在一次访问每个字符(并按顺序)中获得匹配