看看这个: http: //www.boost.org/doc/libs/1_44_0/libs/regex/doc/html/boost_regex/configuration/algorithm.html
递归/非递归区别的存在是一个非常强烈的建议,即 BOOST 不一定是线性时间离散有限状态机。因此,您很有可能可以针对您的特定问题做得更好。
最好的答案很大程度上取决于你有多少干草堆和一根针的最小尺寸。如果最小的针比几个字符长,您可能会比通用的正则表达式库做得更好。
基本上所有的字符串搜索都是通过在当前位置(光标)测试匹配来工作的,如果没有找到,则再次尝试将光标向右滑动更远。
Rabin-Karp 从您正在搜索的字符串(或多个字符串)中构建一个 DFSM,以便将测试和光标运动组合在一个操作中。但是,Rabin-Karp 最初是为单针设计的,因此如果一个匹配项可能是另一个匹配项的正确前缀,则您需要支持回溯。(请记住,当您想要重用代码时。)
另一种策略是尽可能将光标向右滑动多个字符。Boyer-Moore 就是这样做的。它通常是为单针制造的。构建一个包含所有字符的表格以及它们出现在针中的最右边的位置(如果有的话)。现在,将光标定位在 len(needle)-1。表格条目将告诉您 (a) 可能找到针的光标向左偏移量,或 (b) 您可以将光标 len(needle) 向右移动更远。
当您有不止一根针时,您的桌子的构造和使用会变得更加复杂,但它仍然可能会为您节省一个数量级的探针。您仍然可能想要创建一个 DFSM,但不是调用通用搜索方法,而是调用 dos_this_DFSM_match_at_this_offset()。
另一种策略是一次测试超过 8 位。有一个垃圾邮件杀手工具可以一次查看 32 位机器字。然后它会执行一些简单的哈希码以将结果放入 12 位,然后查看表格以查看是否有命中。每个模式都有四个条目(从模式开始的偏移量为 0、1、2 和 3),然后尽管表中有数千个模式,但它们只测试主题中每个 32 位字的一个或两个线。
所以总的来说,是的,当针是恒定的时,你可以比正则表达式更快。