假设我有一个固定的字符串列表。
对于任何输入字符串,我想找出列表中的哪个字符串是输入字符串的子字符串,或者列表中没有这样的字符串。
我这样做的方法是:对于列表中的每个字符串,将其作为模式并使用正则表达式匹配来查看它是否与某处的输入字符串匹配。
使用正则表达式是一种过度杀伤的方法吗?
感谢。
它是在C ++中。计划是使用C ++标准库或Boost库。
答案 0 :(得分:2)
绝对有点过分。正则表达式需要在构造上编译模式,而你只是使用常量子串进行线性搜索。标准的库可以满足您的需求:http://www.cplusplus.com/reference/string/string/find/
答案 1 :(得分:2)
通常,不,正则表达式不是在字符串中查找固定子串的好方法。
有几种子字符串搜索算法比天真的逐字节搜索更快。其中最受欢迎的是Boyer-Moore。该网站列出了大多数众所周知的网站,包括Boyer-Moore及其变体:http://www-igm.univ-mlv.fr/~lecroq/string/index.html。
然而,大多数正则表达式引擎实际上在内部使用Boyer-Moore来提升性能(正则表达式引擎之间的竞争实际上是一件事)。所以在某些情况下,regexp IS 是一种很好的方法。
但是。既然你提到你正在使用Boost那么你应该能够直接使用Boost的boyer_moore_search()
而无需使用正则表达式。
请注意,如果搜索字符串很小,Boyer-Moore效率低下。对于小型搜索字符串,还有其他算法可以胜过它。因此,您可能需要进行一些研究,并将算法与您自己的典型搜索字符串进行比较。但总的来说,Boyer-Moore是一个不错的选择。