1. ホーム
  2. regex

[解決済み] 正規表現の一部だけを大文字小文字を区別しないようにすることはできますか?

2022-11-06 15:53:39

質問

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

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

fooFOOfOoFoOBARBARbarbarbAr

大文字小文字に関係なく "foo" のすべての出現にマッチさせたいが、大文字の "BAR" のみにマッチさせたい場合はどうすればよいですか?

理想的なソリューションは、正規表現のフレーバーに関係なく動作するものですが、言語固有のものも聞きたいと思っています (ありがとうございます。 エスポ )

編集

Espoさんが提供してくれたリンクはとても参考になりました。 式の中で修飾語をオン・オフすることについて、良い例が載っています。

私の考えた例では、次のようなことができます。

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

で、fooの部分だけ大文字小文字を区別しないマッチになります。

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

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

どのように解決するのですか?

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

最近のregexのフレーバーでは、正規表現の一部だけにモディファイアを適用することができます。正規表現の途中に修飾子 (?ism) を挿入すると、修飾子の右側の部分だけに修飾子が適用されます。モードをオフにするには、その前にマイナス記号を付けます。マイナス記号の後のモードはすべてオフになります。例: (?i-sm) は大文字小文字を区別せず、単一行モードと複数行モードの両方をオフにします。

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

使用している正規表現がモード修飾子をどのように扱うかをすぐにテストすることができます。正規表現 (?i)te(?-i)st は test と TEst にマッチしますが、teST や TEST にはマッチしません。

ソース