マッチ演算子/正規表現

正規表現では、文字列のパターンが「一致する」ことを「マッチする」と言います。まずはマッチするかどうかをチェックする方法を覚えましょう。

/文字列のパターン(正規表現)/
※文字列がマッチするかチェックする
if ( /a./) {
print $_;
}
「if」構文の条件として「/a./」と指定しています。「/」と「/」の間に、文字列のパターンを書きます。この文字列のパターンにマッチした場合は、「if」構文で指定した処理が行われます。ところで、上のプログラムでは、マッチするかどうかチェックする文字列は何になるのか指定していません。それを指定しない場合、自動的にスカラー変数「$_」に指定されている文字列がチェックされます。「$_」は、特に変数名を指定しない時に、代わりとして使われる特殊変数です。上のプログラムの場合、この記述の前に、「$_」に何かしら文字列を指定する記述が書かれていて、それをプログラムで利用している訳です。

変数名を指定してマッチするかチェックする方法

$data = "ab";
if ($data = ~/a./) {
print "マッチしました";
}
マッチするかどうかチェックしたい文字列が特殊変数「$_」として指定されている場合は、上記で説明した通りでいいのですが、すでに、別のスカラー変数として指定されている場合、例えば「$data として指定されている文字列がマッチするかどうかをチェックしたい!!」という場合もあります。そういう時は、マッチ演算子「=~」lを使用します。※イコールとチルダです。
3行目に「if」構文が出来てきます。その条件として、マッチ演算子と正規表現を使用しています。そこだけを取り出してみましょう
$data = ~/a./
上記は、マッチ演算子「=~」の左側にあるスカラー変数「$data」が正規表現で表した文字列のパターンを含んでいるかをチェックしています。該当すると「{ }」内が実行されます。

正規表現

■1文字にマッチさせる
/a./ 「a」と、改行文字以外の文字1文字、という意味
[abc] a/b/cのどれか1つがマッチするかチェックする。
[^abc] a/b/c以外の1文字を含めばマッチします。
[0-9] [0123456789]という意味です。
■複数の文字列にマッチさせる
/abc*/ 「ab」が来て、次に「c」が0個以上ある、という意味になります。ですから、「ab」「abc」「abcccccc」といった文字列がすべてマッチします。
/abc+/ 「1個以上ある!」なので、「abc」「abccc」はマッチします。「ab」はマッチしません。
/abc?/ 「0個または1個ある」なので「ab」と「abc」両方マッチします。「abccc」もマッチします。
/data{0-9}+/ 「data01」「data125」「data8」はマッチします。「data」はマッチしません。
/data{0-9}*/ 「*」は「0個以上ある」なので、「+」と違い「data」「datafile」はマッチします。
/a{1,5}/ 「a」が「1個以上5個以下」となります。「aa」「aaaaa」がマッチします。
/a{1,}/ 「a」が1個以上、という意味です。(「/a+/」と同じ意味です)
/a{0,5}/ 「●以下なら何でも良し!」としたい場合は、このように「0個以上」という表現を使う。
/a{5}/ 「{」「}」の間に数字を1つだけ記述すると、その数字の個数だけという意味になります。
■正規表現をカッコで囲む
正規表現を「( )」で囲むと、そのカッコで囲まれた正規表現にマッチ文字列を自動的にスカラー変数に指定します。スカラー変数は、順番に「$1」「$2」「$3」・・・・という名前になります。
/abc(.)egf$1/ 「.」=「改行文字以外の文字なら何でもよいから1文字」という意味です。「abc」と来て、次に何でもいいので1文字来て、その後「efg」が来ることになります。そして「$1」にカッコに囲まれている「.」に当てはまった文字が指定されます。それが「efg」の後に来ると指定しています。
abcrefgrはマッチします。「abc」の後に、「r」が1文字来て、その後に「efg」が続きます。ここまでが「abc(.)efg」です。その後に来る「$1」ですが、カッコに囲まれている「.」に該当する「r」が、この「$1」に自動的に入ります。それが「efg」の後に来るわけです。
/abc(.)(.*)$1$2/ カッコを2つ以上使う場合は、左から順番に「$1」「$2」「$3」・・・・という名前のスカラー変数に指定されます。まず「abc」が来て、次に改行文字以外の文字が1文字(これが$1になる)、その次に改行文字以外の文字が0文字以上(これが$2になる)、次に$1、そして次に$2と続きます。
■どれか1つにマッチさせる
複数の文字列のうちどちらかにマッチする、という条件にしたい場合は、「|」を使います。
/a|b|c/ 「a」「b」「c」のうち、どれかにマッチする、という意味になる。
$data=~/はし/; 「$data」に「はし」という文字列が含まれている場合か、または「餃子」という文字が含まれている場合、マッチすることになる。
■マッチさせる位置を指定する
文字列の特定の部分がマッチするかどうかをチェックします。例えば、文字列の最後がマッチするかどうか、なんてことをチェックする場合に使用します。
/~data[0-9]*/ 文字列の最初がマッチするかどうかチェックする
/data[0-9]*$/ 「data」「data1」「data30」はマッチします。「datafile」「datalist」「dataです」はマッチしません。
※含まれているかを検索する
/^data[0-9]*$/ 「data」「data1」「data30」はマッチします。「datafile」「datalist」「dataです」はマッチしません。
※完全一致を検索する
I'm from Japan. "I'm"と"from"と"Japan"の間にあるスペースが「単語境界」
/abc\b/ 「abc」はマッチしますが、「abcd」はマッチしません。
/\bab/ 最初の「\b」が単語境界を意味し、次に文字列「ab」が来ています。「ab」「abc」はマッチしますが、「aab」「bab」などにはマッチしません。
/\babc\b/ 「abc」という文字列の前後に「\b」を付けます。こうすると、「abc」にはマッチしますが、「aabc」や「abcd」にはマッチしません。