前節までで、正規表現の基本的な書き方を見てきました。 この節では、パターンマッチに関するいろいろな演算子について紹介します。
//演算子はもう何度も使ってきたものですね。/の間に書いた正規表現と文字列がマッチするかどうかを調べます。
@words = ("can", "katsu", "taro", "tsuyo", "satsuki");
foreach (@words) {
if(/can/){
print "$_\n";
}
}
上のスクリプトの3行目を見てください。 if文を使ってパターンマッチをしていますが、これはどの文字列に対しておこなわれているのでしょうか? パターンマッチ演算子は、デフォルトでは特殊変数$_の値と、/の間の正規表現とを比較してマッチングをします。 ですから上の場合、まずforeachで@wordsの内容が順に$_へ代入され、そのそれぞれに対してcanというパターンを含んでいるかどうかを調べているのです。
さて、前節で後方参照について学びました。 実は、正規表現の外でも、この後方参照が出来るのです。 正規表現の中で参照する場合には\整数という形で呼び出しましたが、正規表現の外で参照する場合には$整数という形で呼び出します。
$_ = "2001/08/30";
if(/(\d+)\/(\d+)\/(\d+)/){
$year = $1;
$month = $2;
$day = $3;
print "\$year = ", "$year\n";
print "\$month = ", "$month\n";
print "\$day = ", "$day\n";
}
参照用の特殊変数としてはこのほかに$&(アンパーサンド)、$`(バッククォート)、$'(シングルクォート)があります。$&には正規表現とマッチした部分の文字列が格納され、$`にはマッチした部分よりも前にある文字列、$'にはマッチした部分よりも後ろにある文字列がセットされます。
$_ = "My name is can.";
if (/is/){
print "\$& = ", "$&\n";
print "\$` = ", "$`\n";
print "\$' = ", "$'\n";
}
マッチさせたい文字列があらかじめスカラー変数に格納されている場合はどうすればいいでしょうか? $_に代入しなおすのは手間がかかりますよね。 そのような場合にはパターン結合演算子=~を使います。 =~演算子は、左辺のスカラー変数や文字列を返すような式と、右辺の//や、あとで登場するs///、tr///などと結び付けてくれます。
if ($word =~ /can/) {
print "マッチしました。";
}
正規表現の中にURL等を入れた場合、
/http:\/\/www5c\.biglobe\.ne\.jp\/~can\//
となってしまって、とっても見にくく(醜く)なってしまいます。 そこでPerlでは、次のようにして/以外の区切り文字を使うことが出来ます。
m#http://www5c\.biglobe\.ne\.jp/~can/#
区切り文字に使えるのは、空白文字以外の非英数文字です。 また区切り文字が[ ]のように対になっている場合は、左右できちんと対になっていないといけません。
m[http://www5c\.biglobe\.ne\.jp/~can/[
#これはダメ
m[http://www5c\.biglobe\.ne\.jp/~can/]
#これならOK
「§7.2 もっと正規表現」で、"can"か"Can"か"CAN"のいずれかにマッチする正規表現を紹介しました。
/can|Can|CAN/
ですがこれにはもっと簡単な書き方があります。 それは、後ろの/の後にiをつけるというものです。
/can/i
このように/の後ろにiをつけると、アルファベットの大文字と小文字を区別しないようになります。 ですから上の正規表現は"cAn"や"CAn"等にもマッチします。
このように、正規表現の後ろにくっつけて、いろいろな細かい処理をしてくれる物を修飾子といいます。 次の表は主な修飾子とその意味を表した物です。
修飾子 | 処理 |
---|---|
g | マッチする物を全て見つける |
o | 1回だけ変数展開をする |
i | 大文字と小文字を区別しない |
m | 単一行として扱う |
s | 複数行として扱う |
この節では、パターンマッチに関する演算子をいくつか紹介しました。 マッチングさせたい文字列や正規表現をいろいろと変えて、繰り返し実験をしてみてください。 次の節では、正規表現の最も一般的な利用法である置換演算子、変換演算子について見て行きます。