Go to the first, previous, next, last section, table of contents.

正規表現

パターンマッチングで用いられるパターンは、 Version 8 の regexp ルーチンで使用できるものと同じものである。 (実は、ヘンリースペンサーの再配布自由な V8 ルーチンを使っている。)

これに加えて、以下のマッチングが使える。

\w : アルファベット文字( "_" を含む)
\W : 非アルファベット文字
\b : 単語の境界
\B : 非単語境界
\s : スペース文字(whitespace character)
\S : 非スペース文字
\d : 数字
\D : 非数字

括弧構造 ( ... ) を使うと、 \数字がその数字番目の文字列にマッチする。 (パターンの外では、 数字の前に \ ではなく $ を常に用いなければならない。 $数字$`$&$' の有効範囲は 括弧で囲まれたブロックや eval 文字列、 または次のパターンマッチまでである。 \数字 記述は現在のパターンの外でも使えることがあるが、 それに頼るべきではない。) 括弧はいくつ用いてもよい。 9 より多くの部分文字列がある場合は、 $10,$11... が対応する部分文字列を参照する。 パターンの中では、\10,\11 ... が部分文字列を後方参照する (少なくともその数の左括弧が後方参照箇所の前にある場合。 なければ以前のバージョンとのコンパチビリティのため、 \10\010 すなわちバックスペースと同じ、 \11\011 すなわちタブと同じ、となる。 \1 から \9 までは常に後方参照である。)。

(例)

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}にそれぞれ等しい。

nm の大きさには制限はないが、 大きな数を使うとより多くのメモリーを消費する。

perl では、例えば \b\w\n のように、 バックスラッシュを前に付けるメタキャラクターは すべてアルファベットであることに気がつくだろう。

他の正規表現言語と違い、 アルファベットでない文字にバックスラッシュをつけることはないので、 \\\(\)\<\>\{、 や \} のようなものは全て文字通りに解釈され、 メタキャラクターとは解釈されない。 これにより、メタキャラクターを含んでいるのではないかと心配な文字列を パターンとして使用することが容易になる。 アルファベットでない文字は単純に使用して良い。

$pattern =~ s/(\W)/\\$1/g;

Go to the first, previous, next, last section, table of contents.