我注意到如果我使用正则表达式
.*.*text.*.*
,匹配所需的时间比.*text.*
您可能已经猜到,使用双.*.*
的正则表达式(意外地)是由软件生成的。
所以有两个问题:
我打算在运行匹配之前将.*.*
替换为.*
。我可以随时将.*.*
替换为.*
吗?是否存在.*.*
在正则表达式中功能上不等.*
的情况?
任何人都可以用简单的方式解释为什么需要花费更长的时间来匹配.*.*
?
如果这是一个特定于实现的行为,我使用的是Java 7的正则表达式引擎。
答案 0 :(得分:3)
在匹配方面,.*.*
等效至.*
。在性能方面,您将节省大量时间。你应该学习回溯。
您可以看到.*.*Donec.*.*
和.*Donec.*
之间的步骤编号从 101 897 变为 604 ,而Lorem的前两段存有。
答案 1 :(得分:0)
两个正则表达式.*
和.*.*
在数学上完全相同。如果它们以相同的速度不匹配,则归因于编译和匹配时使用的实现。
如果你使用一个好的正则表达式编译器,你将获得一次通过,没有回溯算法只能探索匹配字符串的每个字符一次,处理O[n]
算法,与常规的复杂性无关你使用的表达方式。
顺便说一句,绝大多数语言(perl,java,php等)中使用的所有当前实现都源于对匹配字符串的有限NFA(非确定性有限自动机)的直接解释。但是,如果您阅读Compilers, Principles, Techniques and Tools中描述的算法,您会发现只能在一次访问每个字符(并按顺序)中获得匹配