C#正则表达式中环顾效率.如果可以,我应该避免使用它们吗?
作者:互联网
大家!我对正则表达式还很陌生,但是我很喜欢它们,很多!
如果可以的话,请称我为nitpicky,但我真的很想知道如果我可以选择的话,是否应该避免使用前行和后行.
例如,下面的两个命令执行相同的操作,一个命令使用lookbehind,另一个则不使用.
the_str = Regex.Replace(the_str, @"(;|!|\?) \.{3}", "$1...");
the_str = Regex.Replace(the_str, @"(?<=(;|!|\?)) \.{3}", "...");
您会使用哪一个?哪个更有效?
感谢您的回答!
解决方法:
我在本地进行了测试,而使用后向跟踪的方法要慢25%.
我使用先行而不是先行测试的另一种变体仅慢了10%:
s = Regex.Replace(s, @"(;|!|\?) (?=\.{3})", "$1");
我认为性能差异不足以建议始终避免环顾四周.如果您认为它使代码更具可读性,请使用它们.仅当性能分析表明您遇到性能问题并且正则表达式成为瓶颈时,才优化性能.
作为参考,我测试的字符串是“等等; … 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})", "")
标签:lookahead,c,regex,lookaround 来源: https://codeday.me/bug/20191023/1915758.html