107

正規表現全体で大文字と小文字を区別しないようにする例をたくさん見てきました。私が疑問に思っているのは、式の一部だけで大文字と小文字を区別しないことです。

たとえば、次のような文字列があるとします。

fooFOOfOoFoOBARBARbarbarbAr

大文字と小文字に関係なく、出現するすべての「foo」を一致させたいが、大文字の「BAR」のみを一致させたい場合はどうなりますか?

理想的な解決策は、正規表現のフレーバー全体で機能するものですが、言語固有のフレーバーも聞くことに興味があります(Thanks Espo

編集

Espoが提供したリンクは非常に役に立ちました。式内で修飾子のオンとオフを切り替える良い例があります。

私の不自然な例では、次のようなことができます。

(?i)foo*(?-i)|BAR

これにより、一致のfoo部分についてのみ、一致で大文字と小文字が区別されなくなります。

これは、Javascript、Python、およびその他のいくつか(Espoが述べたように)を除くほとんどの正規表現実装で機能するように見えました。

私が疑問に思っていた大きなもの(Perl、PHP、.NET)はすべて、インラインモードの変更をサポートしています。

4

5 に答える 5

93

Perlでは、(?i :)パターン修飾子を使用して、正規表現の一部を大文字と小文字を区別しないようにすることができます。

最新の正規表現では、正規表現の一部にのみ修飾子を適用できます。正規表現の中央に修飾子(?ism)を挿入すると、修飾子は正規表現の修飾子の右側の部分にのみ適用されます。モードの前にマイナス記号を付けると、モードをオフにできます。マイナス記号以降のすべてのモードがオフになります。たとえば、(?i-sm)は大文字と小文字を区別しないようにし、単一行モードと複数行モードの両方をオフにします。

すべての正規表現フレーバーがこれをサポートしているわけではありません。JavaScriptとPythonは、すべてのモード修飾子を正規表現全体に適用します。モード修飾子が正規表現全体に適用される場合、オプションをオフにしても意味がないため、これらは(?-ismx)構文をサポートしていません。デフォルトでは、すべてのオプションがオフになっています。

使用している正規表現フレーバーがモード修飾子をどのように処理するかをすばやくテストできます。正規表現(?i)te(?-i)stは、testおよびTEstと一致する必要がありますが、teSTまたはTESTとは一致しません。

ソース

于 2008-09-04T12:35:25.520 に答える
6

どの言語を使用していますか?これを行う標準的な方法は、大文字と小文字を区別する/([Ff] [Oo] {2} | BAR)/のようなものですが、たとえばJavaには、大文字と小文字を区別する修飾子(?i)があります。右側の文字では大文字と小文字が区別されず、(?-i)大文字と小文字が区別されます。そのJava正規表現修飾子の例はここにあります。

于 2008-09-04T12:41:19.857 に答える
6

残念ながら、大文字と小文字を区別しないマッチングの構文は一般的ではありません。.NETでは、RegexOptions.IgnoreCaseフラグまたは?i修飾子を使用できます

于 2008-09-04T12:41:45.083 に答える
4

あなたが使うことができます

(?:F|f)(?:O|o)(?:O|o)

.Netの括弧内の?:は、キャプチャされていないことを意味し、|の用語をグループ化するために使用されます。(または)ステートメント。

于 2008-09-04T12:37:31.473 に答える