3

みんな!私は正規表現にはまったく慣れていませんが、とても気に入っています。

よろしければ私をつまらないと呼んでください。しかし、オプションがある場合、先読みと後読みを使用しないようにする必要があるかどうかを本当に知りたいです。

たとえば、次の 2 つのコマンドは同じことを行います。1 つは後読みを使用し、もう 1 つは使用しません。

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 に答える