パターンマッチングで用いられるパターンは、 Version 8 の regexp ルーチンで使用できるものと同じものである。 (実は、ヘンリースペンサーの再配布自由な V8 ルーチンを使っている。)
これに加えて、以下のマッチングが使える。
\w : アルファベット文字( "_" を含む) \W : 非アルファベット文字 \b : 単語の境界 \B : 非単語境界 \s : スペース文字(whitespace character) \S : 非スペース文字 \d : 数字 \D : 非数字
\w
、\s
、\d
を character class の中で用いても良い。\n
、\r
、\f
、\t
、\NNN
は
通常と同じ意味を持つ。\b
は単語境界ではなくバックスペースを表す。|
で区切る。
括弧構造 (
... )
を使うと、
\数字
がその数字番目の文字列にマッチする。
(パターンの外では、
数字の前に \
ではなく $
を常に用いなければならない。
$数字
と $`
、$&
、$'
の有効範囲は
括弧で囲まれたブロックや eval
文字列、
または次のパターンマッチまでである。
\数字
記述は現在のパターンの外でも使えることがあるが、
それに頼るべきではない。)
括弧はいくつ用いてもよい。
9 より多くの部分文字列がある場合は、
$10
,$11
... が対応する部分文字列を参照する。
パターンの中では、\10
,\11
... が部分文字列を後方参照する
(少なくともその数の左括弧が後方参照箇所の前にある場合。
なければ以前のバージョンとのコンパチビリティのため、
\10
は \010
すなわちバックスペースと同じ、
\11
は \011
すなわちタブと同じ、となる。
\1
から \9
までは常に後方参照である。)。
$+
は最後にマッチした括弧を返す。
$&
はマッチした文字列全体を返す。
($0
は同じものを返していたが、現在はそうではない。)
$`
はマッチした文字列の前の全文字を返す。
$'
はマッチした文字列の後の全文字を返す。
(例)
s/^([^ ]*) *([^ ]*)/$2 $1/; # 最初の 2 単語を入れ替える if (/Time: (..):(..):(..)/) { $hours = $1; $minutes = $2; $seconds = $3; }
デフォルトでは、文字 ^
は文字列の最初のみ、
文字 $
は文字列の最後
(または最後の改行文字の前の文字)のみに一致することが保証されていて、
また、perl は文字列が 1 行しか含んでいないと仮定して最適化している。
改行文字が複数ある場合の ^
と $
の挙動は矛盾する
(beinconsistent)。
しかし、文字列を複数行のバッファとして扱い、
^
が文字列中の全ての改行文字の後にマッチし、
$
が全ての改行文字の前にマッチするようにしたい場合もあるだろう。
これを実現するには、少しオーバーヘッドを要するが、
$*
変数に 1 をセットすれば良い。
この変数を 0 に戻せば、perl は本来の挙動に戻る。See section $* : 複数行パターンマッチングを行うか否か.
複数行の置換を容易にするために、文字 .
は改行文字にマッチしない
($*
が 0 の時でも)。特に、次の例では、$_
に改行文字を残す。
$_ = <STDIN>; s/.*(some_string).*/$1/;
改行文字がいらないなら、次のどれかを試せば良い。
s/.*(some_string).*\n/$1/; s/.*(some_string)[^\000]*/$1/; s/.*(some_string)(.|\n)*/$1/; chop; s/.*(some_string).*/$1/; /(some_string)/ && ($_ = $1);
正規表現の各要素の後に、
中括弧で囲んだ数字を {n,m}
の形で付けることができる。
ここで n
はその要素にマッチする最小限の回数、
m
は最大限の回数を表す。
{n}
の形は {n,n}
と同等であり、
n
回ちょうどにマッチする。
{n,}
の形は n
以上の回数にマッチする
(中括弧が別のコンテキストで使われた場合は、中括弧は通常の文字として扱われる)。
修飾子 *
は {0,}
、修飾子 +
は {1,}
、
修飾子 ?
は {0,1}にそれぞれ等しい。
n
や m
の大きさには制限はないが、
大きな数を使うとより多くのメモリーを消費する。
perl では、例えば \b
、\w
、\n
のように、
バックスラッシュを前に付けるメタキャラクターは
すべてアルファベットであることに気がつくだろう。
他の正規表現言語と違い、
アルファベットでない文字にバックスラッシュをつけることはないので、
\\
、 \(
、 \)
、 \<
、 \>
、 \{
、
や \}
のようなものは全て文字通りに解釈され、
メタキャラクターとは解釈されない。
これにより、メタキャラクターを含んでいるのではないかと心配な文字列を
パターンとして使用することが容易になる。
アルファベットでない文字は単純に使用して良い。
$pattern =~ s/(\W)/\\$1/g;