Location : Home > Languages > Perl > Instruction
Title : Regular Expression
Toolbox Logo

Regular Expression

 正規表現(Regular Expression)とは、文字列のパターンを規則正しく表すルールである。Perl の場合、/ / で囲って正規表現であることを示す。

1文字に対するパターン

 正規表現の中で最も多く用いられるのが、1文字にマッチするパターンの指定である。

.

 ドットまたはピリオドは、改行文字以外の任意の1文字にマッチするパターン表記である。例えば /a.c/ であれば a と c の間に何でもいいので1文字あるような文字列(例えば abc、a1c…などなど)がこれにマッチする。

[ ]

 1対の括弧に囲まれた文字列のうち、どれか1文字にマッチするパターンの表記である。例えば /[abcde]/ とあれば a から e までのどれかの文字にマッチするパターンを指す。また、範囲を表す場合は - (ダッシュ)を用いる。例えば任意の数字1桁と言うパターンを表現したい場合には /[0123456789]/ と書くこともできるが、これは /[0-9]/ と表記できる。従って、英数字で何か1文字というパターンを指定したいときは /[a-zA-Z0-9]/ と記す。

 また「〜でない1文字」と指定したい場合は、その正規表現の前にキャレット(^)を置く。例えば「数字以外の1文字」は /[^0-9]/ と書く。[]や - そのものをマッチさせたい場合には、処理を示す記号ではなく文字であることを示すためにその前にエスケープシーケンスとして逆スラッシュ(\;とは言え、日本語環境では半角の円マーク¥にしか表示されないが)を置く。

 さらに、よく使う以下のようなパターンは予めクラスが準備されている。

表記等価な表現意味
\d[0-9]数字1字
\w[a-zA-Z0-9_]単語1字
\s[ \r\t\n\f]空白文字
\D[^0-9]数字以外1字
\W[^a-zA-Z0-9_]単語以外1字
\S[^ \r\t\n\f]空白文字以外

 ちなみに \r は復帰文字(CR;キャリッジリターン)、\t はタブ文字、\n は改行文字、\f はUNIXでの改行文字(LF;ラインフィード)を示す。

複数の文字に対するパターン

(文字そのもの)

 正規表現として文字そのものを書けば、それはその文字列とマッチするパターンを指す。当たり前だが、/abc/ と書けば、 abc という文字列にマッチするパターンを指定したことになる。

+

 + は直前の文字が1つ以上繰り返すパターンを指す。例えば /ab+/ であれば ab、abb、abbb…というパターンを意味する。

?

 ? は直前の文字が0または1つ繰り返すパターンを指す。つまり、例えば /ab?/ であれば ab というパターンだけでなく、a もマッチする。

*

 * は直前の文字が0以上繰り返すパターンを指す。例えば /ab+/ であれば ab、abb、abbb…というパターンだけでなく、a もマッチする。

{Lower_limit, Upper_limit}

 {Lower_limit, Upper_limit} は、直前の文字を繰り返す回数を指定したパターンを指す。例えば /x{5,10}/ であれば、x を5回以上10回以下繰り返した文字列とマッチする。/x{5,}/ と上限を省略すると、x を5回以上繰り返す文字列とマッチする。逆に5回以下しか繰り返さない文字列とマッチさせたい場合には /x{0,5}/ と明示的に書く必要がある。

 これを利用すると、例えば「a b の間に5文字ある文字列」は /a.{5}b/ と表現できる。

( )

 ( ) は、括弧で囲まれた正規表現の結果を(その正規表現内で)後に参照して利用する際に用いる。参照する際には、その正規表現内で出現する順番の前に逆スラッシュを付けて呼び出す。例えば


/a(.)b(.)c\2de\1/

で、1つめの . にマッチした文字が \1 に、2つめの . にマッチした文字が \2 に格納された文字列が最終的にマッチする。

|

 | は、複数の選択肢の提示に用いる。例えば


/a|b|c/

であれば a または b または c のいずれか1つにマッチすることを指す。

 なお、1つの正規表現の中に複数の繰り返し指定がある場合、最も左にある指定が優先されるので注意する必要がある。

位置を指定するパターン

 文字をマッチさせる際に、文字列がある特定の場所であってほしい場合(またはそうでない場合)にそれを指定する方法である。

\b, \B

 単語の境界にマッチしてほしい場合には \b を、単語の境界でない場所でマッチしてほしい場合には \B を置く。以下に例を示す。

表記説明
/Alex\b/Alex にはマッチするが、Alexander にはマッチしない。
/\bion/ion にはマッチするが、Zion にはマッチしない。
/\bAlex\b/正確に Alex のみにマッチする。
/\bAlex\B/Alexander にはマッチするが、Alexにはマッチしない。

^, $

 マッチする文字列が、行の先頭にあるもののみを探索したい場合には、そのマッチする文字列の前に ^ を置く。逆に行末にマッチさせたい場合には文字列の後に $ を置く。それぞれこれ以外の場所に置くと別の意味に解釈されるのでの注意すること。 ^ なら前述の「1文字クラス」の否定形に、$ ならスカラ変数の定義と解釈される恐れがある。
 また、^ や $ 自身をマッチさせたい場合にはこれらの文字の前にバックスラッシュ(\)を置く。

優先順位の指定

 正規表現にも処理の優先順位が定められている。下の表は優先順位の高い順に書かれている。

名称表記
括弧( )
繰り返し指定+ * ? {m,n}
位置指定^ $ \b \B
選択|

正規表現で用いる演算子

 正規表現を用いて様々な処理を行う際に指定できる演算子を以下に示す。

=~

 パターンをマッチさせたい文字列が $_ 以外の変数に格納されており、しかも諸事情で $_ に移せないとき、その既に格納されている変数に対して正規表現のマッチ処理を行うことを宣言する演算子が =~ である。


$aisatsu = "Hello, World!"
$aisatsu =~ /^Wo/;

 $aisatsu 自体がマッチングの対象となって、2行目ではその中に、単語の先頭部分に "Wo" があるかどうかを探しているわけだが、存在するので答えは真である。

i

 ある文字列をマッチングしたいが、その文字列のどの一部も大文字・小文字のどちらでもよいときに、全ての場合を記述することは不可能ではないが極めて面倒である。これをただ1つの設定で示すのが i である。


print "Are you a human-being?"
if (<STDIN> =~ /^y/i) {
   (statements)
}

 /^y/ で「yで始まる文字列」をマッチングすることになるが、"yes"であっても、"Yes"であっても、"YES"であってもマッチングさせたいので、/yes|Yes|YES/ とも書けるし、さらに y か Y で始まっていればそれでいいのでこれを簡単に /\y/i と書いているわけだ。

m

 マッチングさせたい文字列に / が含まれる場合、この直前に \ を置くことで文字列として扱うことができるが、 / が数多くある場合は非常に見にくいコードとなる。または個人的に / が嫌いだと言う人が他の記号を使いたいというときに、演算子 m を用いてデリミタを他の文字に変換することができる。


m@^/usr/etc@;
m#^/usr/etc#;

 1行目では @ がデリミタになり、2行目では # がデリミタになる。

$1, $2, $3, ...

 マッチングが成功すると、変数 $1, $2, $3, …には それぞれ \1, \2, \3, …の値が格納され、その値を取得することができる。

s

 マッチングが成功した結果に対し、他の文字列と置換する時には演算子 s を用い、以下のように記述する。また、マッチングした最初の文字列だけでなく、全ての候補について置換するときには末尾に g を付ける。


s/old expression/new expression/;
s/old expression/new expression/g;

split( ), join( )

 split( ) は、正規表現と文字列を引数にとり、正規表現に適う部分を全て切り出して配列に格納することができる。


$Line = "A:B:C:D::F";
@Hairetsu= split(/:/, $Line);

 これは要するに : をデリミタとして $Line を分解して、@Hairetsu に A, B, C, "", F を格納している。
 この逆の操作を行うのが join( ) である。


$OutLine = join(/:/, @Hairetsu);

 $OutLine には、$Line と同じ文字列が格納されることになる。

Toolbox Logo
Updated : 2007/04/16