メタ文字(.)が改行にマッチ(「/s」修飾子)

オプション修飾子の一つである「/s」を設定すると、メタ文字の「.」が改行にもマッチするようになります。オプション修飾子を指定しない場合は「.」は改行にはマッチしません。ここでは Perl の正規表現で使用する「/s」修飾子の使い方について解説します。

(Last modified: )

「/s」修飾子の使い方

パターンに /s 修飾子を指定するとメタ文字( . )が改行にもマッチするようになります。書式は次の通りです。

m/パターン/s

オプション修飾子を指定しない場合、メタ文字の . は改行にはマッチしませんでした。(メタ文字 . については「任意の一文字(.)」を参照して下さい)。

次のようなパターンを例として考えてみます。

/AA.+BB/

上記は "AA" で始まり、任意の文字を表すメタ文字 . が 1 回以上繰り返されたあと "BB" が現れる文字列にマッチします。それでは次のような文字列を対象にマッチさせてみます。

DD AA EE BB\n CC BB FF

この場合 "AA" で始まり任意の文字が続き "BB" で終わる部分は次の箇所です。

AA EE BB

次に同じパターンに対して /s 修飾子を付けた場合です。

/AA.+BB/s

先ほどと同じ対象文字列に対してパターンをマッチさせてみます。

DD AA EE BB\n CC BB FF

この場合 "AA" で始まり改行を含む任意の文字が続き "BB" で終わる部分は次の箇所です。

AA EE BB\n CC BB

/s 修飾子を付けた場合、メタ文字 . が改行 "\n" にもマッチするようになります。

サンプルコード

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

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

&check1("AA EE BB\n CC BB");
print "----\n";
&check2("AA EE BB\n CC BB");

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

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

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

perl sample.pl

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

メタ文字(.)が改行にマッチ(1)

パターンに「/s」修飾子を付けることで、メタ文字( . )が改行にもマッチするようになりました。

-- --

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

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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