正则表达式 vs 字符串操作函数:哪个更好?

4

如果我需要在句子中查找一个单词,我可以考虑两种方法:

  1. 使用 string.IndexOf
  2. 使用 Regex

从性能或最佳实践的角度来看,哪种方法更好呢?

4个回答

6

如果不使用正则表达式完成某项任务是比较简单的,那么这种方法几乎总是更加经济实惠的。String.IndexOf(或者 String.Contains)就是一个明显的例子。


3

这绝不是最科学的测量方法,但以下是一些源代码,表明(在非常特定的约束条件下)正则表达式比indexof慢大约4倍。

class Program
{
private const string Sentence = "The quick brown fox jumps over the lazy dog";
private const string Word = "jumps";

static void Main(string[] args)
{
    var indexTimes = new List<long>();
    var regexTimes = new List<long>();
    var timer = new Stopwatch();

    for (int i = 0; i < 1000; i++)
    {
        timer.Reset();
        timer.Start();
        Sentence.IndexOf(Word);
        timer.Stop();
        indexTimes.Add(timer.ElapsedTicks);
    }

    Console.WriteLine(indexTimes.Average());

    for (int i = 0; i < 1000; i++)
    {
        timer.Reset();
        timer.Start();
        Regex.Match(Sentence, Word);
        timer.Stop();
        regexTimes.Add(timer.ElapsedTicks);
    }

    Console.WriteLine(regexTimes.Average());

    Console.ReadLine();
}
}

3

这取决于您的具体需求。如果您确实需要在句子中查找一个单词(而不是一个子字符串),那么我认为使用一个命名良好的正则表达式模式可以更简洁、更明确地表达,而不是使用 IndexOf 加上所有额外的逻辑来确保您实际上得到了一个完整的单词。

另一方面,如果您只是在寻找一个子字符串,那么从性能和可读性的角度来看,IndexOf 更加优越。


+1 是为了考虑到非标准情况。在“你必须将这两个部分分开,并使用此部分”中查找“part”,如果使用IndexOf,则会返回“parts”中的“part”,如果遍历整个字符串,则总共返回三个匹配项,而其中只有一个是完整的单词“part”。使用IndexOf进行完整单词匹配存在问题,因为许多不同的字符可以表示单词边界。相比之下,使用正则表达式 "\bpart\b" 将精确匹配整个单词“part”一次,并且可能比复杂的IndexOf算法更少消耗资源。 - KeithS

2

在最佳实践方面,string.IndexOf 对于阅读代码的人可能更加明显。当人们看到正则表达式时,他们的大脑往往会关闭,因此像 IndexOf 这样直接的方法可以保持他们的大脑开放。

至于性能,这取决于许多因素,并且只能通过特定代码的基准测试来正确回答。


最佳实践并不基于语法的可读性。而且正则表达式比普通字符串函数显然更耗费资源。 - Nick Rolando
@Nicklamort 那么什么是“最佳实践”呢? - CanSpice
最佳实践是指一种技术、方法、流程、活动、激励或奖励,传统智慧认为在特定条件或情况下应用时比任何其他技术、方法、流程等更有效地实现特定结果。-维基百科 - Nick Rolando
这是主观的,就是这样。在编码中,“最佳实践”通常是可读性、可维护性(是的,它们有区别)和性能的最佳综合组合。 - KeithS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接