Perl/正規表現

出典: フリー教科書『ウィキブックス(Wikibooks)』

Perl > 正規表現


Perlは強力な正規表現をサポートしています。その強力さゆえに、初めは少し難しく感じるかも知れませんが、少し慣れれば自由自在に操ることができ、そして、なくてはならない道具となることでしょう。

目次

[編集] 基礎

[編集] マッチング

$foo =~ /bar/;

このコードは $foo が 文字列 bar を含むかどうか真偽値を返します。 正規表現を用いるときに使用する演算子は =~ です。

真偽を返すので、主に条件分岐を行う際に用いられます。

if("Wikibooks" =~ /book/){
  print "Match!";
}else{
  print "Not match.";
}

含むかどうかの結果を反転する演算子 !~ も存在します。

if("Wikibooks" !~ /books/){
  print "Not match.";
}else{
  print "Match!";
}

/.../ 内ではダブルクォーテーション ("...") と同じく、変数やエスケープシーケンスが評価されます。

$bar = "books";
"Wikibooks" =~ /$bar/ # マッチする。

m を前置すると正規表現を囲う記号にスラッシュ以外を用いることができます。 [ ], ( ), < >, { } などの括弧は開き括弧と閉じ括弧が対応するように用います。

$foo =~ m/bar/;
$foo =~ m#bar#;
$foo =~ m@bar@;
$foo =~ m!bar!;
$foo =~ m{bar};
$foo =~ m(bar);

囲み記号にシングルクォーテーションを用いると、変数やエスケープシーケンスが評価されるのを防ぐことができます。

$foo = "books";
"Wikibooks" =~ m/$foo/; # マッチする
"Wikibooks" =~ m'$foo'; # マッチしない


[編集] メタキャラクタ

正規表現において特殊な意味を持つ文字をメタキャラクタと呼びます。

+ * ? . ( ) [ ] { } | \ $ ^

これらの文字をあらわすには \+, \* のようにバックスラッシュでエスケープします。

$foo =~ /\+/;
$foo =~ /\*/;

[編集] アンカー

アンカーとは長さを持たない正規表現です。

代表的なものに、文字列先頭にマッチする ^、文字列末尾にマッチする $ があります。

"Wikibooks" =~ /^Wiki/; # マッチする
"Wikibooks" =~ /book$/; # マッチしない

他に、単語の境界(正確には、単語の先頭あるいは末尾)にマッチする \b、それ以外の部分にマッチする\B があります。

"Wikibooks"  =~ /Wiki\b/; # マッチしない
"Wiki books" =~ /Wiki\b/; # マッチする

[編集] キャラクタクラス

ブラケットで囲んだ部分はキャラクタクラスになります。 キャラクタクラスはその中のいずれかひとつにマッチする正規表現です。

"Wikibooks" =~ /[ab]/; # a は含まれないが、b は含まれるのでマッチする

ハイフン (-) を用いると文字の範囲を指定することができます。

$foo =~ /[abc]/;
$foo =~ /[a-c]/;   # 上の文と等価
$foo =~ /[01234]/;
$foo =~ /[0-4]/;   # 上の文と等価

ハイフンの前の文字は、後ろの文字よりも文字コードにおいて前でなければなりません。

$foo =~ /[b-a]/; # エラー
$foo =~ /[5-3]/; # エラー
$foo =~ /[a-3]/; # エラー

ハイフン自体をキャラクタクラスに含めるには、キャラクタクラスの一番前か一番後ろに記述するか、バックスラッシュでエスケープします。

$foo =~ /[-ab]/;  # ハイフンまたは a か b にマッチする
$foo =~ /[ab-]/;  # 上の文と等価
$foo =~ /[a\-b]/; # 上の文と等価

開きブラケット ([) に ^ を後置すると、否定キャラクタクラスを表現することができます。

$foo =~ /[^0-9]/; # 数字以外にマッチする

[編集] グループ化

丸括弧で括った部分はグループ化されます。

グループ化した部分は後から参照することができます。これを後方参照といいます。 同じ正規表現内で後方参照を行うには、\1, \2... を用います。

$foo =~ /(abc)\1/; # abc が2回連続する文字列にマッチする

また、正規表現外で後方参照を行うには、スカラー変数 $1, $2... を用います。

"Wikibooks" =~ /(wiki)/i;
print $1; # 'Wiki' と出力される。

[編集] 選択

縦線を用いると正規表現を選択することができます。

$foo =~ /abc|def/; # abc あるいは def にマッチする
$foo =~ /^abc|def$/;

これは、^$| よりも優先順位が高いため、abc で始まる文字列か def で終わる文字列にマッチします。

"abc" か "def" にマッチさせるには以下のようにします。

$foo =~ /^(abc|def)$/;

[編集] 置き換え

このページ「Perl/正規表現」は、書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にノートへどうぞ。
ヘルプ