我不是新手使用正则表达式,我理解他们所基于的基本理论 - 有限状态机。
虽然我不太擅长算法分析,也不理解正则表达式与基本线性搜索的比较。我问,因为从表面上看,它似乎是一个线性阵列搜索。 (如果正则表达式很简单。)
我可以在哪里了解有关实施正则表达式引擎的更多信息?
答案 0 :(得分:44)
这是最受欢迎的大纲之一:Regular Expression Matching Can Be Simple And Fast 。针对字符串运行DFA编译的正则表达式确实是O(n),但可能需要最多O(2 ^ m)的构造时间/空间(其中m =正则表达式大小)。
答案 1 :(得分:8)
你熟悉术语确定性/非确定性有限自动机吗?
真正的正则表达式(当我说真实我指的是那些识别常规语言的正则表达式,而不是那些几乎是正则表达式的正则表达式每种编程语言都包含反向引用等)可以转换为DFA / NFA,两者都可以用编程语言的机械方式实现(NFA可以转换为DFA)
你要做的是:
这样,给定正则表达式,您可以将其转换为DFA并运行它以查看它是否匹配指定的文本。
这可以在O(n)
中实现,因为DFA不会后退(如图灵机),因此它与字符串匹配与否。假设您不会接受计数重叠匹配,否则您将不得不返回并再次开始匹配...
答案 2 :(得分:5)
经典的正则表达式可以在实践中快速实现,但具有非常糟糕的最坏情况行为(标准DFA)或以确保合理的最坏情况行为(将其保持为NFA)的方式实现。标准DFA可以扩展为支持大量额外匹配字符和标志,这些字符和标志利用了它基本上是跟踪搜索的事实。
标准方法的示例无处不在(例如内置于Perl中)。有一个例子声称http://code.google.com/p/re2/表示良好的最坏情况行为 - 实际上它比我在最坏的情况下预期的要好,所以他们可能会发现一两个额外的技巧。
如果您对此感兴趣,或者关心编写可以锁定固定病理输入的程序,请阅读http://swtch.com/~rsc/regexp/regexp1.html。