正则表达式:使用 DFA 搜索(而不是匹配)



我一直想知道正则表达式匹配器搜索模式背后的理论。所以,假设我有一个匹配aab的正则表达式,如果不是在字符串的开头match,我希望能够从字符串的任何位置开始执行此匹配。我的意思是 - 在匹配模式下,我只能验证字符串aab与正则表达式一致,另一方面search这应该与产生相应跨度结果aaab一起使用。 所以超级具体 - 有没有办法构建 DFAsearcher,或者这基本上是不可能的,因为它需要额外的内存,而您在 DFSM 中无法拥有。很明显,您实际上可以通过将matcher重新应用于 for 循环中的输入字符串来从matcher构建searcher,但这种方法的复杂性类似于 O(len_of_pattern * len_of_input(。

正则表达式搜索器基本上与正则表达式匹配器相同,.*附加到表达式的前面。

我想你基本上回答了你自己的问题。搜索,就像现代正则表达式实现中的许多其他功能一样,利用内存的奇迹来做有限自动机不可行的事情。传统上,DFA 不能遍历字符串或沿输入回溯,因为这需要内存。搜索需要能够查找匹配项,然后了解该匹配项在字符串中的匹配方式。

最新更新