9章.正規表現

正規表現は文字のパターンを組み合わせたテンプレートによって表現します。テンプレートと文字列が一致する事をマッチすると言います。
例えば,文字列"Hello! kibitaro"の中にはパターン"kibita"と一致した部分があるのでマッチしたと言えます。

9.1.一文字にマッチするパターン

.(ピリオド)は改行文字(\n)以外の任意の1文字にマッチします。 また,パターンは/(スラッシュ)で囲みます。パターン中に(.,/,*,+,?,\)を含める場合は直前に\を記入します。(\.,\/,\+,\\)
/xy./はxyで始まる3文字の並びにマッチします。(xyz,abxy12)


9.2.文字クラス

1対のブラケット([])の中に文字を並べたものを文字クラスと呼びます。
文字クラス内容簡略記法簡略記法の否定形
[1234567890]数字1文字にマッチ\d\D,[^0-9]
[0-9]数字1文字にマッチ\d\D,[^0-9]
[a-z0-9]英小文字か数字の1文字にマッチ
[a-zA-Z0-9]英字か数字の1文字にマッチ\w\W,[^a-zA-Z0-9]
[ \r\t\n\f]空白,CR,TAB,LF,FFの1文字にマッチ\s\S,[^ \r\t\n\f]


9.3.パターンのグループ化

n文字のパターンにマッチする指定の方法です。

9.3.1.繰り返し

*は直前の文字や文字クラスが0個以上ある場合に使います
+は直前の文字や文字クラスが1個以上ある場合に使います
?は直前の文字や文字クラスが0か1個ある場合に使います

文字の繰り返し個数を指定したい場合にはブレース({})で指定します。
xが3個(xxx)は,x{3}と指定します。 一般に{a[,[b]]}と書き{a}ならa個,{a,}ならa個以上,{a,b}ならa個以上b個以下となります。


9.3.2.選択

複数のパターンの選択が指定できます。

/x|y|z/はxかyかzのいずれかにマッチします。(axb,y1,1z)


9.3.3.カッコ

パターンをカッコ()で囲んでマッチする部分を記憶できます。 カッコで囲んだマッチする部分をカッコの順番に\1,\2,\3...のように記憶します。
/a(.*)h(.*)opq\2z/は"ahopqz"とか"aBChIJopqIJz"とマッチしますが, "aBChIJopqIJKz"とはzの前にKがあるためにマッチしません。\1は"BC",\2は"IJ"になります。


パターンマッチする文字列の例
a*aab,xa,(厳密に言えばaが無くても良い)
ab*ab,xabc,a(bが無くても良い)
a+a,aab,xa
a?ab,xa,(厳密に言えばaが無くても良い)
.*kibi,gomaなどの\nを除く任意の文字列。0文字でも良い
\d+1,12,1234などの数字列
(.|\n)\nを含む任意の1文字=扱える全ての文字
(.|\n)*\nを含む任意の文字列。0文字でも良い
ab.*yaby,xabcdyzなどのabで始まりyで終わる文字列


9.4.マッチ演算子

9.4.1.=~演算子

パターンは基本的に$_変数の内容と比較されます。

$fileのレコードの中で文字列"xyz"を含むレコードの印刷

open(IN,$file);
while();
  if(/xyz/) {
    print "$_";
  }
}
close(IN);

open(IN,$file);
while($x = );
  if($x =~ /xyz/) {
    print "$x";
  }
}
close(IN);

$_変数以外の時は=~演算子を使います。


9.4.2.オプション

オプション内容
gできるだけ多くの回数マッチを行う
i英字の小文字と大文字を区別しない
o変数展開を1回だけ行う

/xyz/iは(xyz,Xyz,XyZ)などとマッチします。


9.4.3.変数展開の利用

$a = "ABxyzC"; $x = "xyz";
if($a =~ /$x/) { #/xyz/と同じ
  print "True\n";
}


9.4.4.特殊変数

9.3.3項で説明したように1対のカッコで任意のパターンを囲むと,\1,\2などの内容を特殊変数で参照する事ができます。
/%(.*) %(.*) %(.*)/は"%abc %def %ghi"とマッチすると, $1に"abc"が,$2に"def"が,$3に"ghi"が代入されます。


9.5.置換演算子

s/旧文字列/新文字列/[g][i][e][o]
パターンは基本的に$_変数の内容と比較されます。 $_変数以外の時は=~演算子を使います。

オプション内容
g旧文字列にマッチしたパターンを全て新文字列に置き換える
i英字の小文字と大文字を区別しない
e新文字列を式と見なす
o変数展開を1回だけ行う

$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
%xxという全ての文字列を16進数の(xx)と見なして符号無しの文字に置き換える。(CGIのフォームのデコードでよく使う)

$value =~ s/</&lt;/g;
タグの<を&lt;に置き換える。

$value =~ s/\n//g;
改行文字を全て無くす。


9.6.変換演算子

tr/旧リスト/新リスト/[c][d][s]
変換の対象は基本的に$_変数の内容です。 $_変数以外の時は=~演算子を使います。

aに対してz,bに対してy,cに対してx,dに対してw,eに対してvと対応づけた場合, $_="acbefdg"の時,tr/abcde/zyxwv/とすると$_は"zxyvfwg"と変換される。

オプション内容
c旧リストに含まれない文字を新リストに置き換える
d旧リストに含まれない文字を全て削除する
s置き換えた結果で同じ文字が連続するときは1文字に圧縮する

新リストの指定が無くオプションも無い時は,旧リストと同じ物が新リストに指定されているものと見なされます。
$value =~ tr/a-z//;は$value =~ tr/a-z/a-z/;と同じ意味です。

$value =~ tr/+/ /;
文字+を全て空白に置き換える。

$value =~ tr/a-z/A-Z/;
英小文字を全て英大文字に置き換える。

$value =~ tr/a-z/ABCDE/d;
a〜eの文字をそれぞれA〜Eに置き換え,f〜zの文字は全て削除する。
つまり,新リストに対応しない旧リストに含まれる文字は削除される。

$a = "yama e ikou ne";
$a =~ tr/a-z/ABCDE/d;
print "$a\n"; AA E E

$value =~ tr/a-z//c;
a〜z以外の文字を削除する。

$a = "Hello! Perl";
$a =~ tr/a-z//c; # 英小文字以外は削除
print "$a\n";

$a = "Hello! Perl";
$a =~ tr/a-z/*/c; # 英小文字以外を*に置き換える
print "$a\n";

elloerl
*ello***erl

$value =~ tr/a-z/A-Z/s;
英小文字を全て英大文字に置き換える。

$a = "Hello! Perl";
$a =~ tr/a-z/A-Z/s;
print "$a\n";

$a = "Hello! Perl";
$a =~ tr/a-z/*/cs; # 英小文字以外を*に置き換える
print "$a\n";

HELO! PERL llがLの1文字に圧縮されている
*ello*erl ! Pが*の1文字に圧縮されている

[HOME]

Copyright (c)1996 GOMASUKE
Since 09/08/1996, Last Updated 09/08/1996