メタ文字の「^」や「$」が行の先頭と末尾にもマッチマッチする(「/m」修飾子)

オプション修飾子の一つである「/m」を設定すると、文字列の先頭にマッチする「^」が行の先頭にもマッチするようになり、文字列の末尾にマッチする「$」が行の末尾にもマッチするようになります。ここでは Perl の正規表現で使用する「/m」修飾子の使い方について解説します。

(Last modified: )

「/m」修飾子の使い方

パターンに /m 修飾子を指定すると、メタ文字の ^ が文字列の先頭だけでなく行の先頭にマッチするようになり、メタ文字の $ が文字列の末尾だけでなく行の末尾にもマッチするようになります。

m/パターン/m

例えば次のような途中に改行が含まれる文字列で考えてみます。

"AABB CCDD\nAACC BBDD"

この文字列に対して /^AA../ のようなパターンとマッチするかどうか調べる場合、メタ文字の ^ は文字列の先頭にしかマッチしないのでこの文字列の中でパターンにマッチするのは "AABB" だけです。

それに対して /^AA../m のように /m 修飾子を付けた場合、メタ文字の ^ は文字列の先頭に加えて行の先頭にもマッチするのでこの文字列の中でパターンにマッチするのは "AABB" と "AACC" になります。

次にこの文字列に対して /..DD$/ のようなパターンとマッチするかどうか調べる場合、メタ文字の $ は文字列の末尾にしかマッチしないのでこの文字列の中でパターンにマッチするのは "BBDD" だけです。

それに対して /..DD$/m のように /m 修飾子を付けた場合、メタ文字の $ は文字列の末尾に加えて行の末尾にもマッチするのでこの文字列の中でパターンにマッチするのは "BBDD" と "CCDD" になります。

このように /m 修飾子を使うことで、文字列の中に改行が含まれる場合に、メタ文字の ^$ を改行の直後や直前の位置にもマッチさせることができるようになります。

サンプルコード

それでは簡単なサンプルを作成します。

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

&check1("AABB CCDD\nAACC BBDD");
print "----\n";
&check2("AABB CCDD\nAACC BBDD");

sub check1{
  if ($_[0] =~ /..DD$/){
    print "$_[0] は /..DD$/ にマッチします。\n";
    print "マッチした部分 $& です。\n";
  }else{
    print "$_[0] は /..DD$/ にマッチしません。\n";
  }
}

sub check2{
  if ($_[0] =~ /..DD$/m){
    print "$_[0] は /..DD$/m にマッチします。\n";
    print "マッチした部分 $& です。\n";
  }else{
    print "$_[0] は /..DD$/m にマッチしません。\n";
  }
}

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

次のように実行結果が表示されます。

メタ文字の「^」や「$」が行の先頭と末尾にもマッチマッチする(1)

パターンに「/m」修飾子を付けることで、メタ文字の $ が文字列の末尾だけでなく行の末尾にもマッチするようになりました。

-- --

Perl の正規表現で使用する「/m」修飾子の使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。