RegexOptions.IgnoreCase は、私が思っていたよりも高価です (たとえば、ほとんど測定できないはずです)。
これが PHP、Python、Perl、Ruby などに加えて C# (Jeff が使用していると私が想定しているもの) に適用されると仮定すると、どのくらいの速度低下が発生し、同様のペナルティが発生/[a-zA-z]/
し/[a-z]/i
ますか?
RegexOptions.IgnoreCase は、私が思っていたよりも高価です (たとえば、ほとんど測定できないはずです)。
これが PHP、Python、Perl、Ruby などに加えて C# (Jeff が使用していると私が想定しているもの) に適用されると仮定すると、どのくらいの速度低下が発生し、同様のペナルティが発生/[a-zA-z]/
し/[a-z]/i
ますか?
はい、[A-Za-z] は を設定するよりもはるかに高速ですRegexOptions.IgnoreCase
。主に Unicode 文字列が原因です。しかし、それはまた、はるかに制限的です -- [A-Za-z] は、アクセント付きの国際文字と一致しません。これは文字通り A-Za-z ASCII セットであり、それ以上のものではありません。
私のメッセージに対する Tim Bray の回答を見たかどうかはわかりませんが、良い回答です。
国際化された検索で最も厄介な問題の 1 つは、大文字と小文字です。この大文字と小文字の概念は、ラテン語、ギリシャ語、およびキリル文字セットで記述された言語に限定されています。英語を話す人は、怠け者であるという理由だけで、検索で大文字と小文字が区別されないことを自然に期待しています.Nadia JonesがGoogleで自分自身を調べたい場合、彼女はおそらくnadia jonesと入力するだけで、システムがそれを処理することを期待します.
そのため、インデックス作成とクエリの両方で、検索システムがすべての単語を小文字または大文字に変換して「正規化」することはかなり一般的です。
問題は、ケース間のマッピングが英語ほど単純ではないことです。たとえば、ドイツ語の小文字「ß」は、大文字にすると「SS」になり、古き良き大文字の「I」は、トルコ語で小文字にすると、ドットのない「ı」になります (はい、「i」があります。大文字バージョンは「İ」です)。フランスとケベックでは、「é」などのアクセント付き文字を大文字にする規則が異なることを読みました (ただし、直接確認したわけではありません)。これらすべての結果の 1 つは、java.String.toLowerCase() などのソフトウェアがこれらすべてのコーナー ケースを回避しようとするため、実行速度が驚くほど遅くなる傾向があることです。
http://www.tbray.org/ongoing/When/200x/2003/10/11/SearchI18n
その正規表現に数字とアンダースコアを使用できる場合は、たとえば \w 修飾子 (Perl 構文) を使用できます。一部のエンジンは [:alpha:] をサポートしていると思いますが、それは純粋な Perl ではありません。\w は、現在のロケールを考慮して、大文字と小文字の両方に一致します。大文字と小文字を無視して [AZ] を使用するよりも高速です。
これが気になる場合は、ケースをすべて上またはすべて下に設定してから確認するとよいでしょう。
たとえば、Perl では次のようになります。
$x = "abbCCDGBAdgfabv";
(lc $x) =~ /bad/;
場合によってはよりも優れている可能性があります
$x = "abbCCDGBAdgfabv";
$x =~ /bad/i;