大文字と小文字を区別しない正規表現の一部にできますか?


100

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

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

fooFOOfOoFoOBARBARbarbarbAr

大文字と小文字を区別せずに「foo」のすべての出現に一致させたいが、大文字の「BAR」だけに一致させたい場合はどうなりますか?

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

編集する

Espoが提供したリンクは非常に役に立ちました。エクスプレッション内でモディファイアをオンまたはオフにすることについての良い例があります。

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

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

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

これは、Javascript、Python、およびその他いくつかの正規表現の実装で機能するようです(Espoによると)。

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


この質問は、「修飾子」の下のスタックオーバーフローの正規表現に関するFAQに追加されました。
aliteralmind 2014

回答:


88

Perlでは、(?i :)パターン修飾子を使用して、正規表現の一部で大文字と小文字を区別しません。

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

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

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

ソース


6

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


+1大文字と小文字を区別できるのに、なぜ大文字と小文字を区別しないのか
Nona Urbiz

11
@NonaUrbiz:式(?i)foobarはより読みやすいため[Ff][Oo]{2}[Bb][Aa][Rr]
Thanatos

1
そして、それは成長することができますので、途中ずっと毛深いと複雑。
チョップする

6

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


4

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

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

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


26
「[fF] [oO] [oO]」がより良い代替案ではありませんか?手元の例では、 "[fF] [oO] \ {2}"まで行くこともできます;-)
Tomalak

4

正規表現の一部のみでモードをオンまたはオフにするで説明されているように、インライン修飾子に依存できるのは事実です。

正規表現(?i)te(?-i)stはtestおよびと一致する必要TEstがありますが、teSTor とは一致しませんTEST

ただし、もう少しサポートされている機能は、(?i:...)インライン修飾子グループです修飾子スパンを参照)。構文は(?i:、次にcasを区別しないようにするパターン、次にです)

(?i:foo)|BAR

:パターンが大文字と小文字を区別しないオプションでコンパイルされ、正規表現の一部を大文字と小文字を区別する必要がある場合は、次のように追加-?ます。(?-i:...)

さまざまな言語での使用例(一致を山括弧で囲む):

  • - preg_replace("~(?i:foo)|BAR~", '<$0>', "fooFOOfOoFoOBARBARbarbarbAr")デモ
  • - re.sub(r'(?i:foo)|BAR', r'<\g<0>>', 'fooFOOfOoFoOBARBARbarbarbAr')デモ)(ノートPythonのreサポートは、 Pythonの3.6以降修飾子グループをインライン化)
  • / / - Regex.Replace("fooFOOfOoFoOBARBARbarbarbAr", "(?i:foo)|BAR", "<$&>")デモ
  • - "fooFOOfOoFoOBARBARbarbarbAr".replaceAll("(?i:foo)|BAR", "<$0>")デモ
  • - $s =~ s/(?i:foo)|BAR/<$&>/gデモ
  • - "fooFOOfOoFoOBARBARbarbarbAr".gsub(/(?i:foo)|BAR/, '<\0>')デモ
  • - gsub("((?i:foo)|BAR)", "<\\1>", "fooFOOfOoFoOBARBARbarbarbAr", perl=TRUE)デモ
  • - "fooFOOfOoFoOBARBARbarbarbAr".replacingOccurrences(of: "(?i:foo)|BAR", with: "<$0>", options: [.regularExpression])
  • -(RE2を使用)- regexp.MustCompile(`(?i:foo)|BAR`).ReplaceAllString( "fooFOOfOoFoOBARBARbarbarbAr", `<${0}>`)デモ

でサポートされていません std::regex

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.