Perl正規表現の基本 1/3

そもそも正規表現とは・・

文字列に対してマッチさせられるテンプレートのこと。パターンとも呼びます。

メタ文字

「*」、「+」、「?」のように直前のものが現れる回数(=量)を指定するメタ文字を「量指定子(quantifier)」といいます。

「^」、「$」のようにパターンを文字列の特定の場所に固定するものを「アンカー」といいます。

「\b」のようにワードの両端にマッチするものを特に「ワードアンカー」といいます。Perl正規表現において「ワード」とは「英数字、アンダースコアで構成されるもの」を指します。

. : 改行文字以外の任意の一文字にマッチ

* : 直前のものに0回以上マッチ
+ : 直前のものに1回以上マッチ
? : 直前のものに0or1回マッチ

^ : 文字列の先頭をあらわす
$ : 文字列の末尾をあらわす

\b : ワードの先頭または末尾をあらわす(片方のみで使用可)

グループにまとめる ()

正規表現のパターンを一つのグループに纏める場合はカッコ()でくくります。また後述しますが、()には正規表現メモリに記憶するという役割もあります。

/fred+/      # ex. fred,freddddddddd・・・
/(fred)+/    # ex. fred,fredfredfred・・・
/(fred)*/    # 任意の文字列

文字クラス []

ブラケットの中の文字のいずれか一文字にマッチします。

キャレット(^)はアンカーとして使用される場合は「文字列の先頭」をあらわしますが、文字クラス[]内では「否定」を意味します。

/[0-9]/   # ex. 0,1,2,3,4,・・,8,9
/[^0-9]/  # ex. a,b,c,A,B,C,_,・・・

よく使用されるパターンにはショートカットが用意されています。

\d    # [0-9]
\w    # [a-zA-Z0-9_]
\s    # [\f\t\n\r ]

\sは単体で使われることはまれで、人間から見て空白になっている部分にマッチするために\s*もしくは\s+の形で使用されます。

\s*   # 空白がない場合も含む
\s+   # 一個以上の空白文字がある

ショートカットの否定形はそれぞれ大文字で記述します。

\D, \W, \S

汎用の量指定子 {下限回数,上限回数}

これまでの量指定子は0回以上(*)、1回以上(+)、0/1回(?)しか指定できませんでしたが、これら以外の繰り返し回数を指定したい場合は、以下のように記述します。下限は省略できません。

/a{2,4}/   # aa, aaa, aaaaがマッチ
/a{2,}/    # aa, aaa, aaaa, aaaaa,・・・(カンマ省略不可)
/a{1,3}/   # a, aa, aaaがマッチ
/a{0,3}/   # 任意の文字列
/a{2}/     # aaのみマッチ

アンカーとワードアンカーの使い方

キャレットアンカー(^)は文字列の先頭、ドル文字アンカー($)は文字列の末尾をあらわします。

パターンが文字列全体にマッチすることを保証するためにこれらを併用することもあります。よく使われる例として空行をあらわす以下の記述法があります。

/^\s*$/

ワードアンカーは\wでマッチするもの(英数字、アンダースコアのみ)先頭もしくは末尾をあらわします。

/w.rd\b/   # ex. word, sword, ward, award,・・・
/\bw.rd/   # ex. word, wordpress, ward, warded, ・・・
/\bw.rd\b/ # ex. word, ward, ・・・
/\Bword\B/ # word以外のワード

また、ワードには、'(シングルクォート)、"(ダブルクォート)、!(エクスクラメーション)などは含まれませんので「That's "Mr.Larry"!」という文字列に含まれるワードは「That」「s」「Mr」「Larry」になります。

後方参照(backreference) \1, \2, ・・・,\n

現在のパターンの処理内で正規表現メモリ内に保存された値を参照します。(後述するマッチ変数と対比すると理解しやすいかもしれません)

正規表現メモリにパターンがマッチした部分を格納するためには保存したいパターンをカッコ()でくくります。つまり、カッコにはパターンの一部分をグループにするだけでなく、そのマッチした値を正規表現メモリに格納するという機能があります。

正規表現メモリに格納された値は\1(メモリ1)、\2(メモリ2)、\3(メモリ3),・・, \nで呼び出します。

以下の例は、同じ文字が二つ連続で続く文字列にマッチします。

まず、(.)でマッチした任意の一文字を正規表現メモリに記憶し、次に続く一文字とそのメモリ1がマッチするパターンです。

マッチしない場合は判定された一文字がメモリ1に記憶され、その次の一文字がメモリ1の文字とマッチするか判定します。

/(.)\1/   # ex. dummy, putty, livedoor, ・・・

複数のカッコが入れ子になったパターンも可能です。

my $backreference = "2ndsecond2ndsecond";
print "true\n" if $backreference =~ /((2nd)(second))\2/;

優先順位

正規表現において、優先順位は以下になります。ここでいう優先順位とは「より強く結びつく」という意味です。数学で「+」や「-」よりも「()」が優先されるのと同じイメージです。

カッコ>量指定子>アンカー、並び(順に並べたもの)>|(選択肢を表す縦棒/or)

優先順位の例

/^start|end$/

これは「start」で始まる文字列、もしくはendで終わる文字列を意味します。

/^(start|end)$/

これは「start」だけを含む文字列、もしくは「end」だけを含む文字列を意味します。

/^(\w+)\s+(\w+)$/

これは「ワード」「空白」「ワード」の構成でそれ以外を含まない文字列を意味します。たとえば「Learning Perl」のような文字列です。

最後の例でみるとまずカッコが優先され、次にその中の量指定子が優先されて「ワード」のかたまりと間に挟まれた一個以上の空白が確定し、最後にその並びと先頭、末尾のアンカーが同列で確定するといった感じになります。