如果我需要在句子中查找一个单词,我可以考虑两种方法:
- 使用 string.IndexOf
- 使用 Regex
从性能或最佳实践的角度来看,哪种方法更好呢?
如果不使用正则表达式完成某项任务是比较简单的,那么这种方法几乎总是更加经济实惠的。String.IndexOf
(或者 String.Contains
)就是一个明显的例子。
这绝不是最科学的测量方法,但以下是一些源代码,表明(在非常特定的约束条件下)正则表达式比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();
}
}
这取决于您的具体需求。如果您确实需要在句子中查找一个单词(而不是一个子字符串),那么我认为使用一个命名良好的正则表达式模式可以更简洁、更明确地表达,而不是使用 IndexOf 加上所有额外的逻辑来确保您实际上得到了一个完整的单词。
另一方面,如果您只是在寻找一个子字符串,那么从性能和可读性的角度来看,IndexOf 更加优越。
在最佳实践方面,string.IndexOf
对于阅读代码的人可能更加明显。当人们看到正则表达式时,他们的大脑往往会关闭,因此像 IndexOf
这样直接的方法可以保持他们的大脑开放。
至于性能,这取决于许多因素,并且只能通过特定代码的基准测试来正确回答。
"\bpart\b"
将精确匹配整个单词“part”一次,并且可能比复杂的IndexOf算法更少消耗资源。 - KeithS