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

広告

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

m/パターン/s

メタ文字の「.」は改行にはマッチしませんでしたが、「/s」修飾子を指定すると改行にもマッチするようになります。(メタ文字「.」については「任意の一文字(.)」を参照して下さい)。

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

/--.+--/

上記は「--」で始まり、任意の文字を表す「.」が1回以上繰り返された後で、「--」が再度現れるまでにマッチします。それでは次のような文字列を対象にマッチさせてみます。

ab -- log dot -- jp¥n stone -- wat

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

ab -- log dot -- jp¥n stone -- wat

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

/--.+--/s

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

ab -- log dot -- jp¥n stone -- wat

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

ab -- log dot -- jp¥n stone -- wat

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

サンプルプログラム

では簡単なプログラムで確認して見ます。

test4-1.pl

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

print "パターン「--.+--/」に対する結果¥n";
&check1("ab -- log dot -- jp¥n stone -- wat");

print "¥nパターン「--.+--/s」に対する結果¥n";
&check2("ab -- log dot -- jp¥n stone -- wat");

sub check1{
  my ($str) = @_;

  if ($str =~ /--.+--/){
    print "○:$str¥n";
    print "マッチする箇所:$&¥n";
  }else{
    print "×:$str¥n";
  }
}

sub check2{
  my ($str) = @_;

  if ($str =~ /--.+--/s){
    print "○:$str¥n";
    print "マッチする箇所:$&¥n";
  }else{
    print "×:$str¥n";
  }
}

上記を「test4-1.pl」の名前で保存します(文字コードはUTF-8です)。そしてコマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。

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

( Written by Tatsuo Ikura )