每次我必须对字符串执行简单的包含或替换操作时,如果我要搜索的术语是一个固定值,我就会发现,如果我使用示例输入并对其进行一些分析,则使用编译后的正则表达式为几乎*总是比使用String类中的等效方法快。
我尝试过比较各种方法(hs
是要搜索的“干草堆”,ndl
是要搜索的“针头”,repl
是替换值。regex
始终使用RegexOptions.Compiled
选项创建):
hs.Replace( ndl, repl )
与regex.Replace( hs, repl )
hs.Contains( ndl )
与regex.IsMatch( hs )
我发现有很多讨论都集中在两种技术中的哪一种更快(1,2,3以及其他负载)上,但是这些讨论似乎总是着眼于:
我不明白怎么可能这样:regex引擎如何比较子字符串匹配的任何两个字符串比等效的字符串版本更快?对于很小或很大的搜索空间,或者很小或很大的搜索词,或者搜索词是早出现还是晚出现在搜索空间中,似乎都适用。
那么,为什么是正则表达式更快?
*实际上,只有的情况,我已经设法证明,在搜索空字符串时,字符串版本比编译后的正则表达式要快!从单个字符串到很长的字符串,任何其他情况都比同等的字符串方法通过编译的正则表达式更快。
更新:添加了一个子句来阐明我正在查看在编译时已知搜索词的情况。对于动态或一次性操作,编译正则表达式的开销将倾向于使结果偏向于字符串方法。
最佳答案
我可以想到两个原因: