Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正则表达式是判断一个字符串是否是另一个字符串的子字符串的好方法吗?_C++_Regex_String - Fatal编程技术网

C++ 正则表达式是判断一个字符串是否是另一个字符串的子字符串的好方法吗?

C++ 正则表达式是判断一个字符串是否是另一个字符串的子字符串的好方法吗?,c++,regex,string,C++,Regex,String,假设我有一个固定的字符串列表 对于任何输入字符串,我想找出列表中的哪个字符串是输入字符串的子字符串,或者列表中没有这样的字符串 我的方法是:对于列表中的每个字符串,将其作为一个模式,并使用正则表达式匹配来查看它是否与某个输入字符串匹配 使用正则表达式是一种过分的方法吗 谢谢 是C++语言。计划是使用C++标准库或Boost库。 绝对过头。正则表达式需要编译构造时的模式,您只需使用常量子字符串进行线性搜索。标准库正好满足您的需要:一般来说,不,regex不是在字符串中查找固定子字符串的好方法 有几

假设我有一个固定的字符串列表

对于任何输入字符串,我想找出列表中的哪个字符串是输入字符串的子字符串,或者列表中没有这样的字符串

我的方法是:对于列表中的每个字符串,将其作为一个模式,并使用正则表达式匹配来查看它是否与某个输入字符串匹配

使用正则表达式是一种过分的方法吗

谢谢


是C++语言。计划是使用C++标准库或Boost库。

绝对过头。正则表达式需要编译构造时的模式,您只需使用常量子字符串进行线性搜索。标准库正好满足您的需要:

一般来说,不,regex不是在字符串中查找固定子字符串的好方法

有几种子字符串搜索算法比简单的逐字节搜索更快。其中最受欢迎的是博耶·摩尔。该网站列出了包括博耶·摩尔及其变体在内的大多数知名品牌:

然而,大多数regex引擎实际上在内部使用Boyer Moore来提高性能(regex引擎之间的竞争实际上是一件事)。因此,在某些情况下,regexp是一种很好的方法

但是。既然您提到您正在使用Boost,那么您应该能够直接使用属于Boost的
boyer\u moore\u search()
,而无需使用正则表达式


但请注意,如果搜索字符串很小,Boyer Moore的效率很低。还有其他一些算法比它更适合小搜索字符串。因此,您可能需要进行一些研究,并将算法与您自己的典型搜索字符串进行比较。但总的来说,Boyer Moore是一个不错的选择。

有了17k+,你肯定知道代码比在黑暗中摸索要好得多:)@Webeng他必须知道任何问题都需要一些代码。问这样一个问题没有什么好的理由,因为答案肯定是:这取决于你。什么语言?这个问题目前太广泛了。正则表达式可以让您在一次调用中指定要检查的内容的整个列表,例如
/(foo | bar | baz)/
,但它仍然会归结为一个正在执行的循环,并且可能不会有太大的效率(也许效率更低)而不是做一堆strpos类型的调用。令人惊讶的是,这被搁置太广了。我会发布一个很好的答案,如果那些被暂停的守门员能稍微冷却一下他们的飞机。最快的方法是使用正则表达式。将字符串列表放在一个正则表达式中,如下所示
str1 | str2 | str3 | str4 | str5
,对得到的每个输入字符串运行正则表达式。为什么这样会更快呢。1.正则表达式变成了trie。2.源被搜索一次。这一组合意味着性能比您能想到的任何其他方式提高30-200000%。。。编译正则表达式一次就可以了。一个更好的链接适合你。我修正了我的答案。谢谢。
string::find
是否使用Boyer-Moore算法来确定一个字符串是否是另一个字符串的子字符串?如果不是,它使用哪种算法?@Tim See。这一实现似乎不是公共知识,但也不是最快的。