编程语言
首页 > 编程语言> > C#正则表达式中环顾效率.如果可以,我应该避免使用它们吗?

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