Perl正規表現の基本 2/3

パターンマッチ m/パターン/

「/パターン/」は実際には「m/パターン/」のmを省略したショートカットです。ここで使っている「/」デリミタは他のものでも代用可能です。よく使用されるのは「{}(ブレース)」です。

オプション修飾子(option modifier)

動作をデフォルトから変えるもので閉じデリミタの直後に記述します。オプション修飾子はフラグ(flag)とも呼ばれます。

「//i」はアルファベットの大文字・小文字不問、「//s」はマッチする対象に改行文字を含みます(=全ての文字を対象とする)。

/\bhoge\b/i   # ex. hoge, HOGE, Hoge,・・・
/Do.*self/s   # ex. Don't \n Repeat \n Yourself

結合演算子 =~

結合演算子(binding operator)は右辺のパターンで左辺の文字列がマッチするかを判定し、ブール値を返却します。マッチした値を左辺に代入するのではありません。実用ではif文の条件式などでよく使用されます。

my $target = "I love Perl!";
print $target =~ /\bperl\b/i, "\n";
print $target =~ /\bruby\b/i, "\n";

出力結果
[user 20071011]$ ./binding_operator.pl 
1

[user 20071011]$

パターンに変数を埋め込む

正規表現でもダブルクォート文字列と同様に変数の展開が行われます。先ほどのサンプルは以下のように書き換えることが可能です。

my $target = "I love Perl!";
my ( $perl, $ruby ) = ( "perl", "\\bruby\\b" );
print $target =~ /\b$perl\b/i, "\n";
print $target =~ /$ruby/i, "\n";

マッチ変数 $1,$2,・・・,$n

もしかするとマッチ変数を理解してからの方が後方参照は理解しやすいのかもしれません。

後方参照、マッチ変数ともに「正規表現メモリに記憶されている値」という点は同じなのですが、以下のような違いがあります。

後方参照 \n : 正規表現内でのみ使用できる現在マッチしている値
マッチ変数 $n : 正規表現外でのみ使用できる既にマッチが完了した値

端的な例を示せば以下のようになります。

my $target="dummy";
print $1,"\n" if $target =~ /(.)\1/;

実行結果
m

また複数のマッチ変数に格納されるのは以下のような例です。

my $line = "My favorite is Perl!";
if ($line =~ /(\w+) (\w+) is (\w+)!/) {
  print "\$1:$1,\$2:$2,\$3:$3\n";
}

実行結果
$1:My,$2:favorite,$3:Perl

マッチ変数は次にパターンマッチは、次のパターンマッチが成功するとリセットされ新しい値がセットされます。逆に次のパターンマッチが失敗した場合は、前回のパターンマッチの値が保持されたままなので注意が必要です。

#そのため、パターンマッチは多くの場合ifやwhileの条件式に使われます

自動マッチ変数 $`, $&, $'

自動マッチ変数はPerlに組み込まれた特殊変数です。

$` : マッチするまでスキップされた部分
$& : 正規表現でマッチした部分全体
$' : マッチしなかった残りの部分

my $line = "My favorite is Perl!";
if ( $line =~ / is (\w+)/) {
  print "\$`:$`,\$&:$&,\$':$'\n";
}

実行結果
$`:My favorite,$&: is Perl,$':!