还有什么比正则表达式匹配整个单词更快的吗?

本文关键字:单词更 什么 正则表达式 | 更新日期: 2023-09-27 17:49:01

EDIT:

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

我的样本匹配字符串(来自老人与海)

他是一个独自在湾流中一艘小船上钓鱼的老人,他已经走了八十四天了,一条鱼也没有钓到。在最初的四十天里,一个男孩一直和他在一起。然而,四十天没钓到一条鱼,男孩的父母告诉他,老人现在肯定是彻底倒霉了,这是最糟糕的运气,男孩听从他们的命令上了另一条船,第一个星期就钓到了三条好鱼。

这是我的正则表达式

"('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)"

这是我第一次不使用regex

的匹配尝试
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 ms
  • matchbyspliting: 250-350 ms,与正则表达式的时间相当。

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

他是一个独自在湾流中一艘小船上钓鱼的老人,他已经走了八十四天了,一条鱼也没有钓到。

正则表达式保持不变,但MatchBySplitting的速度提高了很多:

  • Regex匹配: 220-260 ms
  • matchbyspliting: 50-150 ms -比regex快。

如果我开始扰乱经典,并插入一个匹配

的单词

他是一个独自在湾流中一艘小船上钓鱼的老人,他已经走了八十四天了,一条鱼也没有钓到。在第85天,他钓到了一条金枪鱼。最后

  • 正则表达式匹配: 170-300 ms
  • matchbyspliting: 100-200 ms -比regex快。
我想我已经回答了我自己的问题。在大多数情况下,我的自定义匹配方法似乎等于或比regex更快。

然而,我并没有在我的代码中覆盖所有的单词边界(!?),所以如果我添加这些,它可能会慢一点。

还有什么比正则表达式匹配整个单词更快的吗?

试着编译一个正则表达式,像这样:

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

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