正则表达式与 string:find() 用于简单单词边界

Reg*_*kie 5 c++ regex performance search

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

一种方法是使用如下的正则表达式

.*\y(good|better|best)\y.*
Run Code Online (Sandbox Code Playgroud)

实现此目的的另一种方法是使用如下伪代码:

 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.
 }
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ris 4

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

\y(good|better|best)\y
Run Code Online (Sandbox Code Playgroud)

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