c++ - 正则表达式与字符串 :find() for simple word boundary

标签 c++ regex performance search

假设我只需要找出从文件中读取的一行是否包含来自有限 单词集的单词。

一种方法是使用 regex像这样:

.*\y(good|better|best)\y.*

另一种方法是使用像这样的代码:

 if ( (readLine.find("good")   != string::npos) ||
      (readLine.find("better") != string::npos) ||
      (readLine.find("best")   != string::npos) )
 {
   // line contains a word from a finite set of words.
 }

哪种方式会有更好的性能? (即速度和 CPU 利用率)

最佳答案

正则表达式的性能会更好,但要去掉那些 '.*' 部分。它们使代码复杂化并且没有任何作用。像这样的正则表达式:

\y(good|better|best)\y

将一次性搜索整个字符串。它从这个正则表达式构建的算法将首先查找\y,然后是字符 1 (g|b),然后是字符 2(g => go 或 b => be),字符 3(go => goo 或 be => bes |bet)、字符 4(go => good 或 bes => best 或 bet => bett)等。无需构建您自己的状态机,这会尽可能快。

关于c++ - 正则表达式与字符串 :find() for simple word boundary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4706654/

相关文章:

c# - 正则表达式从用户定义的 id 中提取序列号

performance - 如何解释使用 CUDA 代码在 GPU 设备中观察到的超线性加速?

javascript - 向类或单个元素添加回调

c++ - auto的赋值可以不是r值表达式的结果吗?

c++ - OpenCV 视频处理帧率下降

c++ - 当 char {'0' 用作查找时,std::map '0' ,0} 对会导致逻辑错误

javascript - Express Router Regex - 如何匹配包含连字符的字符串文字?

regex - 解析文件夹中的脚本文件,并在Powershell + RegEx中标记多行字符串

Java - 如果二维数组包含目标数字,则将其行/列清零

c++ - 为什么在 C++ 的表达式中使用无符号整数时会出错?