C#正则表达式中的外观效率。如果可以,我应该避开它们吗?

时间:2010-09-29 19:54:59

标签: c# regex lookahead lookaround

大家好!我对正则表达式很陌生,但我喜欢它们,很多!

如果你愿意的话,叫我挑剔,但如果我有选择,我真的想知道是否应该避免使用前瞻和后视。

例如,下面的两个命令做同样的事情,一个使用lookbehind而另一个不使用。

the_str = Regex.Replace(the_str, @"(;|!|\?) \.{3}", "$1...");

the_str = Regex.Replace(the_str, @"(?<=(;|!|\?)) \.{3}", "...");

你会使用哪一个?哪个更有效率?

感谢您的回答!

1 个答案:

答案 0 :(得分:5)

我在本地进行了测试,使用lookbehind的方法慢了约25%。

我使用前瞻而不是后视测试的另一种变化仅慢了10%:

s = Regex.Replace(s, @"(;|!|\?) (?=\.{3})", "$1");

我认为没有足够的性能差异建议总是避免看似。如果您认为它使代码更具可读性,那么请使用它们。只有在性能分析表明存在性能问题并且正则表达式是瓶颈时才优化性能。

有关信息,我测试的字符串"blah; ... foo ...; bar bar ? ..."重复了1000次,我重复了每次测试100次。

0.944s   No lookarounds    Regex.Replace(s, @"(;|!|\?) \.{3}", "$1...") 
1.027s   Look ahead        Regex.Replace(s, @"(;|!|\?) (?=\.{3})", "$1")
1.210s   Look behind       Regex.Replace(s, @"(?<=(;|!|\?)) \.{3}", "...")
1.124s   Both              Regex.Replace(s, @"(?<=(;|!|\?)) (?=\.{3})", "")