web-dev-qa-db-ja.com

正規表現の `?i`と`?-i`はどういう意味ですか?

誰かが_(?i)および(?-i) Wordを正規表現でラップするとはどういうことですか?

(?i)test(?-i)

テストした結果、testTEST、およびteStと一致しています。しかし、私はこれを見たことがありません。 ?の前にiを意味する?私はこれを見ました こちら

51
Luccas

(?i)は、大文字と小文字を区別しないモードを開始します

(?-i)大文字と小文字を区別しないモードをオフにします

このページの「正規表現の一部のみのモードのオンとオフを切り替える」セクションでの詳細情報

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

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

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

70
gpojd

(?i)オン大文字と小文字を区別しないモード、(?-i)はオフにします。

たとえば、(?i)te(?-i)sttestTEsttEstに一致しますが、teSTには一致しません。

22
Mathletics

Ruby docs。

正規表現の終了区切り文字の後に、パターンの一致方法を制御する1つ以上の単一文字オプションを続けることができます。

/ pat/i-大文字と小文字を区別しない

/ pat/m-で一致する文字として改行を扱います。

/ pat/x-パターン内の空白とコメントを無視します

/ pat/o->#{}補間を1回だけ実行します

i、m、およびxは、(?on-off)コンストラクトを使用して部分式レベルに適用することもできます。これは、括弧で囲まれた式のオプションを有効にし、オプションを無効にします。

5
gmaliar