是否有比正则表达式更快的匹配整个单词?

时间:2014-03-10 15:25:16

标签: c# regex match contains

编辑

我最初的问题是询问是否有任何东西可以比正则表达式更快地匹配整个单词。我添加了我的代码,并运行了几个测试。详情如下

我的样本匹配字符串(来自 The Old Man And The Sea

他是一个老人,独自一人在墨西哥湾小溪的小船上钓鱼,现在已经八十四天没有带鱼了。在最初的四十天里,一个男孩和他在一起。但是在没有鱼的四十天后,男孩的父母告诉他,老人现在肯定是最后的salao,这是最不幸的形式,而且这个男孩已经在另一条船上接到了他们的命令周

这是我的正则表达式

"(\b(cod|tuna|mackerel|plaice|haddock|salmon|prawns|shrimp|fishcake|halibut|sole|eel|anchovy|anchovies|sardine|herring|bonito|whiting|seabass|carp|crab|flounder|pollock|mullet|ray|ray wings|clam|mussel|scallop)(s?)\b)"

这是我第一次没有正则表达式的匹配尝试

public static words = "cod|tuna|mackerel|plaice|haddock|salmon|prawns|shrimp|fishcake|halibut|sole|eel|anchovy|anchovies|sardine|herring|bonito|whiting|seabass|carp|crab|flounder|pollock|mullet|ray|ray wings|clam|mussel|scallop";

public static bool MatchBySplitting(string sentence)
{
    string[] sentence_words = sentence.Split(',','.',' ',';','-');
    string[] match_words = words.Split('|'); 

    foreach(string w in sentence_words)
    {
        foreach(string m in match_words)
        {
            if(m == w)
                return true;
        }
    }
    return false;
}

每个运行5000次迭代:

  • 正则表达匹配: 250-300毫秒
  • MatchBySplitting: 250-350毫秒,与正则表达式相当的时间。

但是,如果我将匹配的字符串缩短到第一行,我的结果会更改

他是一个老人,独自一人在墨西哥湾流中的小船上钓鱼,现在已经八十四天没有带鱼了。

正则表达式保持不变,但MatchBySplitting加速了很多:

  • Regex Matching: 220-260 ms
  • MatchBySplitting: 50-150毫秒 - 比正则表达式更快。

如果我开始搞乱经典,并插入一个匹配的单词

他是一个老人,独自一人在墨西哥湾小溪的小船上钓鱼,现在已经八十四天没有带鱼了。然后在第八十五天,他抓到了金枪鱼。结束

  • 正则表达匹配: 170-300 ms
  • MatchBySplitting: 100-200 ms - 比正则表达式更快。

我想我在这里回答了我自己的问题。在大多数情况下,我的自定义匹配方法似乎等于或快于正则表达式。

但是,我没有覆盖我的代码中的所有单词边界(!?)所以如果我添加它们可能会减慢一点。

1 个答案:

答案 0 :(得分:2)

尝试制作一个已编译的正则表达式,如下所示:

static readonly Regex CornRegex = new Regex("\b(corn)\b", RegexOptions.Compiled);

这实际上会生成并编译一个方法,其中包含匹配该正则表达式所需的汇编指令。它应该非常快,与编写自己的自定义函数相比,它可以循环遍历单个字符。