§7.4 パターンマッチ関連の演算子


作成日:2001/08/30(木)

前節までで、正規表現の基本的な書き方を見てきました。 この節では、パターンマッチに関するいろいろな演算子について紹介します。

パターンマッチ演算子//

//演算子はもう何度も使ってきたものですね。/の間に書いた正規表現と文字列がマッチするかどうかを調べます。

 @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 複数行として扱う

この節では、パターンマッチに関する演算子をいくつか紹介しました。 マッチングさせたい文字列や正規表現をいろいろと変えて、繰り返し実験をしてみてください。 次の節では、正規表現の最も一般的な利用法である置換演算子、変換演算子について見て行きます。


「§7.3 正規表現の拡張機能」へ 「§7.5 置換演算子と変換演算子」へ
ソフトバンク パブリッシング株式会社

Copyright (C) can All Rights Reserved
e-mail:ishiki@mrj.biglobe.ne.jp