本サイトではアフィリエイト広告を利用しています
コーディング

コード 正規表現

[Perl 正規表現] 拡張構文の小ネタ

2020年4月10日

Perl 限定ですが開きマル括弧のあとに記号をつける((?)ことによって、正規表現の拡張構文が使えます。
拡張構文は、正規表現内で自由に正規表現演算子の細かく部分的に使うことができます。

拡張構文をどう使うか

正規表現内にコメントを入れたい

 regexp
(?# コメント)

正規表現内にコメントを入れる時の構文です。マル括弧?のあとにシャープ(#)を続けることで、そのあとの文字列はコメントとして解釈されます。マッチングの対象から外れます。

後方参照させないグループ化

(?:...)

マル括弧?のあとにコロン(:)を続けることで、グループ化します。"( ... ) "と同様ですが、後方参照のための記録をしないため、メモリ消費をおさえることができます。

先読み前方一致検索を行う

 regexp[perl](?=パターン)[/perl]

たとえば、 /b[an]+(?=\t)/ は、banana とっいった「b[an]+」にタブが続くものにマッチしますが、マッチ変数 $& (文字列の中でパターン全体がマッチした部分を参照する変数)には拡張正規表現で記述した部分のタブまで含まれません。

否定先読み前方一致検索を行う

 regexp(?!パターン)

たとえば、/banana+(?!bar)/ は、banana とっいった「b[an]+」に bar が続かないないものにマッチしますが、マッチ変数 $& (文字列の中でパターン全体がマッチした部分を参照する変数)には拡張正規表現で記述した部分の bar まで含まれません。

この例だと、bananabar にはマッチしません。

正規表現内で部分的に大文字小文字の区別を行う

 regexp(?ismx)


部分的にパターンマッチ演算子を切り分けて使うことが可能です。「imsx」の4つの演算子はすべて指定する必要はなく、必要なものだけを一つ以上指定します。「i」は大文字・小文字を区別しない、「m」は文字列を複数行として扱う、「s」は文字列を単一行として扱う、「x」は拡張正規表現を使うという意味です。

部分的に「大文字小文字の区別を行う」などの指定に役立ちます。部分的にパターンマッチ演算子を指定して、その部分だけ演算効果を与えたいとき、効果を与えたい部分の直前に置きます。
たとえば、 /J(?i)apan/ とやると、J に続く文字の大文字小文字を区別せずに、JAPAN、JaPaN、JaPAN、JaPan などの大文字と小文字を区別せずマッチします。(?i)演算子の効果をオフにしたい場合は (?-i) のように、 "ダッシュ"記号をつけます。
たとえば、この例だと /J(?-i)apan/ とやると、大文字と小文字を区別して Japan にマッチします(上の他の例にはマッチしません)。

 regexp(?imsx-imsx:パターン)

マル括弧?のあととコロン(:)との間にパターンマッチ演算子をはさむことで、大文字小文字の区別を部分的に行うような書き方ができます。

後方一致検索を行う

 regexp(?<=式)

先行する文字列が式に一致すればマッチします。

後方一致検索の否定形

 regexp(?<!式)

先行する文字列が式に一致しなければマッチします。

-コード, 正規表現
-, , ,