3

每个人!我对正则表达式很陌生,但我喜欢它们,很多!

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

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

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

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

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

感谢您的回答!

4

1 回答 1

5

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

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

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

我认为没有足够的性能差异来建议始终避免环顾四周。如果您认为它使代码更具可读性,那么请使用它们。如果分析显示您有性能问题并且正则表达式是瓶颈,则仅针对性能进行优化。

作为参考,我测试的字符串"blah; ... foo ...; bar bar ? ..."重复了 1000 次,我重复了每个测试 100 次。

0.944s 无环视 Regex.Replace(s, @"(;|!|\?) \.{3}", "$1...")
1.027s 向前看 Regex.Replace(s, @"(;|!|\?) (?=\.{3})", "$1")
1.210s 查看 Regex.Replace(s, @"(?<=(;|!|\?)) \.{3}", "...")
1.124s 两个 Regex.Replace(s, @"(?<=(;|!|\?)) (?=\.{3})", "")
于 2010-09-29T20:05:41.327 回答