正则表达式与字符串:find()表示简单的单词边界

时间:2011-01-16 16:48:10

标签: 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利用率)

3 个答案:

答案 0 :(得分:3)

显然不是第二个(使用'find'),因为你正在运行三个比较(需要遍历字符串至少3次)而不是一个希望聪明的比较。如果正则表达式引擎完全像它应该工作(我想它确实如此)那么它可能至少快三倍。

答案 1 :(得分:3)

在你测量之前你不会知道哪个更快,但问题是:

  1. 正则表达式的实现,尤其是是否需要预编译(如Google RE2,POSIX正则表达式)。
  2. string::find
  3. 的实施
  4. 您正在搜索的字符串的长度。
  5. 您正在搜索多少个字符串。
  6. 我的赌注是在正则表达式上,但是又一次:你必须采取措施来确定。

答案 2 :(得分:3)

正则表达式会表现得更好,但摆脱那些'。*'部分。它们使代码复杂化并且不起任何作用。像这样的正则表达式:

\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)等等。如果没有构建自己的状态机,这就快得多。