正则表达式的复杂性是什么?


75

在字符串上执行正则表达式比较所需的字符串长度的复杂程度是多少?


3
复杂度更多地取决于正则表达式本身的性质,而不是字符串的长度。
路加福音2010年

@LukeH或者,这取决于所使用的编程语言。例如,Python Regex决不能超过DFA的计算机功能,但是Perl Regex可以是Turing完整的。
BlackVegetable

Answers:


71

答案取决于“正则表达式”的确切含义。经典的正则表达式可以被编译确定性有限自动机可以匹配长度的字符串NO(N)的时间。正则表达式语言的某些扩展使情况变得更糟。

您可能会发现以下感兴趣的文档:正则表达式匹配可以简单又快速


我不认为有可能获得用于该文章的测试数据吗?我的工作场所始终使用perl regex。如果它们真的那么慢,我们的硬件将完全失效。
DeepDeadpool,2015年

9

无界-您可以在空的输入字符串上创建一个永不终止的正则表达式。


2
出于好奇,您能举个例子吗?

5
参见man perlre-“'foo'=〜m {(o?)*} x;”。Perl有特殊的代码可以在这种情况下检测无限递归并中断。
亚历克斯·布朗

7

如果您使用常规(TCS:无后向引用,并置,交替,Kleene星)正则表达式,并且已编译正则表达式,则其为O(n)。


0

如果要在RegEx上寻找严格的渐近边界(不考虑表达式本身),那么就没有一个。正如Alex所指出的,您可以创建O(1)或Omega(infinity)的正则表达式。作为一种纯粹的数学算法,正则表达式引擎过于复杂以至于无法执行任何形式的形式渐近分析(除了这种分析基本上毫无价值的事实)。

特定表达式的增长率(由于实际上确实构成了算法),尽管没有必要更容易进行分析,但它的意义要大得多。


1
这是在考虑对正规正则表达式的扩展。可以证明涉及普通构造的正则表达式(例如,没有前向/向后模式)总是在O(输入字符串的长度)时间内终止于任何输入。
克莱门特

@clement即使大多数扩展都不能将RE推到DFA之外。例如,Python Regex始终可以由DFA建模。但是,一旦您开始使用Perl regex(我相信Javascript?),它就会变成与TM等效的动物。
BlackVegetable 2013年

不。真实正则表达式的复杂性得到了很好的定义。
查理·马丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.