■ Perl 正規表現リファレンス

◇ メタ文字

.改行を除く任意の一文字。しかし、パターンマッチ修飾子 /s が使われる場合は改行も含めて全てにマッチする
*0回以上のパターンの繰返し
+1回以上のパターンの繰返し
?0又は1回のパターン
^先頭から
$末尾から
\メタ文字クウォート。\ を使って後続の文字をエスケープすると、メタ文字をリテラルとしてマッチさせることができる
|パターン論理和。例えば /a|b|c/ なら、a 又は、b 又は、c にマッチ
( )パターングループ。カッコ内のパターンにマッチした文字列を記録する
[ ]文字クラス。文字の間にハイフンを挟み、文字列の範囲を表すことができる。例えば、[1234567] の様に規則的に連続した文字列は、[1-7] と表記できる
{ }量指定子
\n改行(文字クラスでも指定可)
\rキャリッジリターン(文字クラスでも指定可)
\fラインフィード(文字クラスでも指定可)
\tタブ(文字クラスでも指定可)
\d数字[0-9](文字クラスでも指定可)
\D数字以外[^0-9]
\w英数字単語[_a-zA-Z0-9](文字クラスでも指定可)
\W英数字単語以外[^_a-zA-Z0-9]
\s空白[ \t\n\r\f](文字クラスでも指定可)
\S空白以外[^ \t\n\r\f]
\b単語境界 \w、\W の間(文字クラスでも指定可)
\B単語境界以外
\x??16 進数

◇ 文字クラス

-範囲
^先頭におくと、以外にマッチ
/[0123456789]/数字にマッチ
/[0-9]/数字にマッチ
/[^0-9]/数字以外にマッチ
/[a-zA-Z]/英字にマッチ
/[a-fA-F\d]/16 進数にマッチ
/[a-z\-]/小文字のアルファベットかハイフンにマッチ
/[0-9]\.?/0から9までの数字1文字で始まり、次に1文字の「.」が続く文字列にマッチ

◇ 後方参照

カッコは、文字や正規表現をグループにまとめる。また、グループにマッチした文字列は記録され、特別な変数によって参照することができる。これを後方参照という。参照の仕方は、カッコで囲んだグループの左から順に、\1、 \2、\3... となる。正規表現の外部では、特殊変数を使って $1、 $2、$3... で参照できる。

m|<(.*?)>.*?|

#<b>SevenKey</b>のようなHTMLタグにマッチさせる
$strSmp = "Seven Key";
$strSmp =~ /^(\w+)/;
print $1, "\n";

#先頭の単語にマッチしたものが $1 に格納され、値を表示する(表示は「Seven」)

◇ 量指定子

{}?最短マッチ
{}最長マッチ
*0 回以上のパターン繰り返し
+1 回以上のパターン繰り返し
?0 または 1 回のパターン
{n}?n 回繰り返しマッチ
{n,}?n 回以上繰り返しマッチ
{n, m}?n 回以上、m 回以下繰り返しマッチ
/abc/abc にマッチ
/a.c/a?c にマッチ
/a(bb|b1|b2)c/abbc、ab1c、ab2c にマッチ
/ab?c/ac、abc にマッチ
/a.*c/ac、abc、ab1c などにマッチ
/a.+c/abc、ab1c などにマッチ
/[0-9]{1, 2}/0 〜 99 にマッチ
/[a-zA-Z]{8,}/英字 8 文字以上にマッチ
/abcde{2}/「abcdee」にマッチ
/(abcde){2}/「abcdeabcde」にマッチ

◇ アンカー

^先頭から(行頭含む)
$末尾から(行末含む)
\A文字列の先頭
\b単語境界 \w、\W の間(文字クラスでも指定可)
\B単語境界の間以外
\G文字列の先頭、又は修飾子 g がついたマッチングが終了した場所を記憶しておき、そこにマッチ
\Z文字列の最後
/^abc/abc で始まるとマッチ
/abc$/abc で終わるとマッチ
/^$/空行とマッチ
/\bSeven\b/「Seven Key」にはマッチ、「SevenKey」にはマッチしない

◇ エスケープシーケンス

特殊文字を表現するために使用する。

\\\
\$$
\``
\aアラーム
\c制御文字
\eエスケープ文字
\f改ページ (form feed)ASCII での \x0c を表す
\n改行 (newline)ASCII での \x0x を表す
\r復帰文字 (return)ASCII での \x0d を表す
\tタブ (tab)ASCII での \x09 を表す
\0Null文字
\128進数の ASCII 値にマッチ
\x81116進数の ASCII 値にマッチ

◇ テキスト修飾子

大文字から小文字、または小文字から大文字への変換をしながらマッチングさせることができる。

\E大文字、小文字変換の終了
\l次の文字を小文字に変換
\L\E までを小文字に変換
\Q\E までのパターン指定メタ文字の意味を打ち消す
\u次の文字を大文字に変換
\U\E までを大文字に変換

◇ マッチ変数

プログラム内のすべての正規表現の処理が遅くなるので要注意

$&文字列の中でパターン全体がマッチした部分を参照
$`文字列の中でマッチに先行する部分を参照
$'文字列の中でマッチに続く部分を参照
$+最後にマッチした文字列を返す

◇ 演算子

VALUE =~ /PATTERN/[option]

VALUE に格納されている文字列から PATTERN がマッチするかチェックする。VALUE のなかに PATTERN がマッチすれば 1 (TRUE)を返し、マッチしなければ "" (FALSE)を返す。通常、VALUE には変数を指定するが、指定しない場合はデフォルトで特殊変数 $_ の値が使われる。[option] は必要に応じて使用する。

◇ 否定形演算子

VALUE !~ /PATTERN/[option]

VALUE に PATTERN がマッチしない場合に 1 (TRUE) を返し、マッチすれば "" (FALSE) を返す。通常、VALUE には変数を指定するが、指定しない場合はデフォルトで特殊変数 $_ の値が使われる。[option] は必要に応じて使用する。

◇ パターンマッチ演算子

m/PATTERN/[option]

パターンマッチで文字列検索を行なう。スカラコンテキストでは、マッチするごとに TRUE を返し、最終的にマッチしなくなったときに FALSE を返す。対象の文字列を変更すると、検索位置は先頭にリセットされる。=~ 演算子か =!~ 演算子で検索対象の文字列を指定しなかったときは、$_ が検索対象となる。区切文字が "/" のときには、最初の m を省略することができる。m を付けるときには、英数字でも空白でもない、任意の文字のペアを区切文字として使うことができる。たとえば、パス名 /root/local/cgi-bin/perl など「/」を含む文字列の場合は、mオプションで区切り文字を変更すると文がすっきりとする。

m|/root/local/cgi-bin/perl|

パターンマッチが、リスト値が要求されるコンテキストで使われると、パターン中のカッコ内部分にマッチしたリストを返す。マッチしたリストは、左から順に $1、$2、$3... と参照できる。マッチが失敗した場合には、空配列が返される。マッチが成功した場合で、カッコが無い場合には、リスト値が返される。

( $x1, $x2, $x3 ) = ( /^(\D+)\d+(\D+)\s*(.*)/ )

リストコンテキストではマッチした値のリストを返し、マッチが失敗したら、空のリストを返す。

#$_ に格納された文字列から日付部分のみを取り出す

($dayY, $dayM, $dayD) = m|(\d+)/(\d+)/(\d+)|;

◇ パターンマッチ演算子のオプション

c g と併せて使用し、失敗時の位置リセット禁止
gマッチするものすべて(リストにして)値を返す
i大文字、小文字の区別なし
s単一行マッチ(ワイルドカードのドットが改行にもマッチ)
m複数行マッチ
oパターンコンパイルを1回だけ行う
x空白を無視、# をコメント処理

◇ 置換演算子

VALUE =~ s/PATTERN/REPLACE/[option]

指定された PATTERN を見つければ、それを REPLACE で置き換える。通常、VALUE には変数を指定するが、指定しない場合はデフォルトで特殊変数 $_ の値が使われる。[option] は必要に応じて使用する。

 $s =~ s/abc/123/;
#「abc」を「123」に置換する

 $s =~ s/(.)\1/$1/g;
# 連続文字を 1 文字にする
 $s =~ s/\@//g;
# @ マークを削除する

スラッシュの区切り文字以外にも、英数字、空白ではない任意の文字が使える。シングルクォート(`)を使うと置換文字列での展開はされない。バッククォートを使うと、置換文字列をコマンドとして実行して、その出力が実際の置換文字列に使われる。PATTERN をカッコ類で括った場合には、REPLACE 用にもう一組の区切り文字を用意する。

$path =~ s(/usr/bin)(/usr/local/cgi-bin);

PATTERN や REPLACE の文字列に変数を含めると、文字列として展開される(例3は test を表示する)。

$lngx = '[0-9]+';
$strx = "test 1 2 3";
$strx =~ s/$lngx//gxo;
print $str, "\n";

◇ 置換演算子のオプション

e式の右側の評価を行う
gマッチするものすべて
i大文字、小文字の区別なし
s単一行マッチ
m複数行マッチ
oパターンコンパイル
x空白を無視、# をコメント処理
ee式の右側の評価を行い、実行後の戻り値を再度評価する

s/<[^>]+>/ /g;

g オプションを使って繰り返し置換する

◇ 変換演算子

VALUE =~ tr/LIST1/LIST2/[option]

指定された LIST1 にマッチするものを LIST2 で置き換える。通常、VALUE には変数を指定するが、指定しない場合はデフォルトで特殊変数 $_ の値が使われる。[option] は必要に応じて使用する。LIST2 を省略すると、マッチした文字は削除される。この関数は変換、もしくは削除した文字数を返す。置換文字列が検索文字列より短い場合、対応する文字がない時は置換文字列中の最後の文字に置き換えられる。tr/// 演算子の変わりに y/// 演算子を使うこともできる。

 $s =~ tr/A-Z/a-z/;
#英大文字を英小文字に変換
$strSamp = "aa..a.aaa.aaa."
$int = $strSamp =~ tr/././;
# $strSmp に含まれる「.」の数を数える

◇ 変換演算子のオプション

c対象リストに含まれないものを変換
d変換リストに含まれないものを削除
s連続文字を 1 文字に変換