我一直想知道正则表达式匹配器搜索模式背后的理论。所以,假设我有一个匹配aab
的正则表达式,如果不是在字符串的开头match
,我希望能够从字符串的任何位置开始执行此匹配。我的意思是 - 在匹配模式下,我只能验证字符串aab
与正则表达式一致,另一方面search
这应该与产生相应跨度结果aaab
一起使用。 所以超级具体 - 有没有办法构建 DFAsearcher
,或者这基本上是不可能的,因为它需要额外的内存,而您在 DFSM 中无法拥有。很明显,您实际上可以通过将matcher
重新应用于 for 循环中的输入字符串来从matcher
构建searcher
,但这种方法的复杂性类似于 O(len_of_pattern * len_of_input(。
正则表达式搜索器基本上与正则表达式匹配器相同,.*
附加到表达式的前面。
我想你基本上回答了你自己的问题。搜索,就像现代正则表达式实现中的许多其他功能一样,利用内存的奇迹来做有限自动机不可行的事情。传统上,DFA 不能遍历字符串或沿输入回溯,因为这需要内存。搜索需要能够查找匹配项,然后了解该匹配项在字符串中的匹配方式。