Perl5 perlre - Perl の正規表現
[DESCRIPTION][正規表現][Version 8 正規表現][FAQやTIPS]
正規表現
パターンマッチで用いるパターンは、Version 8 regexp ルーティ ンで提供されているような正規表現です。
(実際、使用している ルーティンは、Henry Spencer が書き直した再配布可能な V8 の ルーティンを元にしています。)
詳しくは、「Version 8 正規表 現」の節を参照してください。
特に、以下のメタ文字は、標準的な egrep(1) と同様の意味を表わ します:
    \    次のメタ文字をクォートする
    ^    行の最初にマッチする
    .    (改行以外の) すべての文字にマッチする
    $    行の終わりにマッチする
    |    選択
    ()    グループ化
    []    文字クラス
デフォルトでは、文字 "^" は文字列の最初にだけ、文字 "$" は最 後 (もしくは、最後の改行の前) にだけマッチすることが保証され ており、Perl は文字列には 1 行だけが含まれていると仮定して、 最適化を行ないます。
文字列の中に埋め込まれた改行は、"^" や
"$" はマッチしません。
しかし、文字列を複数行のバッファとし て扱い、"^" はすべての改行のあとにマッチし、"$" はすべての改 行の前にマッチするようにしたい場合もあるでしょう。
少しばか り負荷がかかりますが、パターンマッチ演算子に /m 修飾子を付け ると、そのようにすることができるようになります。
(昔のプロ グラムでは $* を設定することでこれを行なっていましたが、Perl 5 でこれを行なうことは芳しくありません。)
複数行の置換を容易にするため、/s 修飾子を使わない限り、文字 "." は改行文字にマッチしません。
この /s 修飾子は、文字列が たとえ複数行であっても単一行であるかのように扱うよう Perl に 指示するものです。
/s 修飾子は、他のモジュールで $* を設定 するような (よくない) 過去のコードを持ってきたような場合にも、 その $* の設定を無効にします。
次のような標準の数量子が認識されます:
    *    0 回以上にマッチ
    +    1 回以上にマッチ
    ?    1 回または 0 回にマッチ
    {n}    ちょうど n 回にマッチ
    {n,}    n 回以上にマッチ
    {n,m}    n 回以上 m 回以下にマッチ
(中括弧が他の文脈であらわれた場合には、通常の文字として扱わ れます。)
"*" 修飾子は {0,}、"+" は {1,}、"?" は {0,1} と等 価なものとして扱われます。
n や m の大きさに制限はありませ んが、大きな数はそれだけメモリを消費します。
デフォルトでは、数量子を付けたサブパターンは、「最長一致」と なり、残りのパターンがマッチしなくならない範囲で、できる限り 多くのものにマッチするようになっています。
つまり、標準の数 量子は、すべて「最長一致」で、(適切な開始位置を与えると) パ ターンが失敗しない範囲で可能な限り長い範囲にマッチします。 もし、最短の範囲でマッチさせたいのであれば、数量子の後に "?" を付けて指定します。
この場合、「最短一致」となるだけで、意 味するところは変わりありません:
    *?    0 回以上にマッチ
    +?    1 回以上にマッチ
    ??    1 回または 0 回にマッチ
    {n}?    ちょうど n 回にマッチ
    {n,}?    n 回以上にマッチ
    {n,m}? n 回以上 m 回以下にマッチ
パターンはダブルクォート文字列として処理されますから、
    \t    タブ
    \n    改行
    \r    復帰
    \f    改ページ
    \v    垂直タブ (それが何であっても)
(訳注: これは使えないように見える)
    \a    アラーム (ベル)
    \e    エスケープ
    \033    8 進数で表した文字
    \x1b    16 進数で表した文字
    \c[    コントロール文字
    \l    次の文字を小文字にする
    \u    次の文字を大文字にする
    \L    \E まで小文字にする
    \U    \E まで大文字にする
    \E    変更の終わり
    \Q    \E まで正規表現のメタ文字をクォートする
も使用できます。
さらに、Perl では以下のものが定義されてい ます:
    \w    「単語」の構成文字 (英数字と "_") にマッチ
    \W    単語の構成文字以外にマッチ
    \s    空白文字にマッチ
    \S    空白文字以外にマッチ
    \d    数字にマッチ
    \D    数字以外にマッチ
\w は 1 字の英数字にマッチするのであって、単語全体にマッチす るのではないことに注意してください。
単語全体にマッチさせる ためには \w+ とする必要があります。
\w, \W, \s, \S, \d, \D は文字クラス内 (で範囲を指定する両端の文字以外の場所) でも使 うことができます。
Perl では以下の長さのない、位置指定子を定義しています:
    \b    単語の境界にマッチ
    \B    単語の境界以外にマッチ
    \A    文字列の最初にのみマッチ
    \Z    文字列の最後にのみマッチ
    \G    前回の m//g が終わったところにのみマッチ
単語の境界 (\b) は \w で定義される文字と \W で定義される文字 の間というように定義されます (順番はどちらが先でもよい)。 文字列の最初と最後には \W に含まれる仮想的な文字があるものと して扱われます。
(文字クラスの中では \b は単語境界ではなく、 バックスペースを表わします。)
\A と \Z は /m 修飾子が用いら れた場合にも 1 か所でしかマッチしないことを除いて "^" と "$" と同じ事になります。
"^" と "$" は内部的な行の境界にもマッ チします。
括弧括り ( ... ) の形式を用いている場合には、\<数字> がその 括られている「数字」番目の部分文字列にマッチします。
(パタ ーンの外では、数字の前の "\" の代わりに "$" を使います。) $<数字> (と $`, $&, $') のスコープは、BLOCK や eval 文字列の 終わりや、次の部分式を使ったパターンマッチまでとなります。 サブパターンとして記録せずに、括弧で括ってサブパターンを区 切りたい (たとえば、選択肢をまとめる) 場合、"(" の後に "?" を続けます。
\<数字> の記法は、そのパターンの外で使える場合 もあるかもしれませんが、これに頼ってはなりません。
括弧は、 好きなだけ使ってかまいません。
10 個以上の部分文字列は、$10, $11 などで参照することができます。
そのパターンの中では、後 方参照の前に最低限、参照している番号の数だけの開き括弧があれ ば、\10, \11 などで参照できます。
その番号の数だけの開き括 弧が無い場合には、(以前のバージョンとの互換性のために) \10 は、\010 (バックスペース)、\11 は \011 (タブ) といった意味に なります。
(\1 から \9 は、常に後方参照を意味します。)
$+ は、最後の括弧対にマッチしたものを返します。
$& は、マッ チした文字列全体を返します。
(以前は、$0 がこの意味に使われ ましたが、現在は使えません。)
$` は、マッチした文字列の前に あったものを返します。
$' は、マッチした文字列の後にあった ものを返します。
例:
    s/^([^ ]*) *([^ ]*)/$2 $1/;    # 最初の 2 語を入替える
   if (/Time: (..):(..):(..)/) {
      $hours = $1;
      $minutes = $2;
      $seconds = $3;
    }
Perl におけるすべてのバックスラッシュ付きのメタ文字が、\b, \w, \n といった英数字であることにお気付きかもしれません。 他のいくつかの正規表現言語とは違って、英数字以外にバックスラ ッシュ付きの記号はありません。
つまり、\\, \(, \), \<, \>, \{, \} といったものはすべて、メタ文字ではなく、リテラル文字 として解釈されます。
このことによって、パターンとして使いた い文字列に、メタ文字と解釈される文字が含まれている可能性があ るときに、たやすくクォートすることができるようになっています。 単に英数字以外の文字を、すべてクォートすればよいのです:    $pattern =~ s/(\W)/\\$1/g;
同じことを行なうために、組み込みの関数 quotemeta() を使うこ ともできます。
マッチ演算子の中でより簡単にメタ文字をクォー トするには、
/$unquoted\Q$quoted\E$unquoted/
とすればよいでしょう。
Perl 5 では、正規表現に一貫した拡張構文を定義しています。 構文は、括弧のペアの中に、最初の文字としてクエスチョンマーク を置いたものとなっています (これは、Perl 4 では構文エラーで す)。
クエスチョンマークに続く文字で、拡張の機能のどれを使 うのかを示します。
いくつかの拡張が、既にサポートされていま す:
(?#text) コメント。
Text は無視されます。
(?:regexp) これは、"()" と同じようにグループ化を行ないますが、
"()" のように後方参照を生成しません。
つまり
split(/\b(?:a|b|c)\b/)
は、
split(/\b(a|b|c)\b/)
と似ていますが、余分なフィールドを作りません。
(?=regexp) 長さの無い、前方参照位置指定子。
たとえば、
/\w+(?=\t)/ は、後ろにタブが続く単語にマッチします
が、そのタブは $& には含まれません。
(?!regexp) 長さの無い、前方参照否定位置指定子。
たとえば、
/foo(?!bar)/ は、後ろに "bar" が続かない "foo" に
マッチします。
前方参照と後方参照は、同じではない
ことに注意してください。
この構文を後方を参照する
ために使うことはできません。
/(?!foo)bar/ では、
"foo" 以外のものに続く "bar" を見つけるものではあ
りません。
(?!foo) は次にくるものが "foo" でない
とだけ言っているからで、次が "bar" であれば、当然
"foo" ではありませんから、"foobar" がマッチします。
先の目的のためには、/(?!foo)...bar/ のように書かな
くてはならないでしょう。
「ように」といったのは、
"bar" の前に 3 文字無い場合もあるだろうからです。
これもカバーするには、/(?:(?!foo)...|^..?)bar/ と
いうように書けるでしょう。
単に:
if (/foo/ && $` =~ /bar$/)
と書いた方が簡単なこともあります。
(訳注: これは if(/bar(?=foo)/) かな。($' を除く))
(?imsx) パターンマッチ修飾子の埋め込み。
これは、パターン が、どこかの表に示され、そのうちのいくつかは大文字
小文字を区別せず、いくつかは区別するといった場合に
便利です。
区別するものでは、単にパターンの先頭に
(?i) を付け加えればよいのです。
たとえば:
$pattern = "foobar";
if ( /$pattern/i )
# パターンに埋め込めば、より柔軟:
$pattern = "(?i)foobar";
if ( /$pattern/ )
この構文や新しい最短一致の構文にクエスチョンマークを選らんだ のは、1) 以前の正規表現においてクエスチョンマークが使われる ことが少なかったこと、2) これを見つけた人は「疑問」に思って なにが起こるのかを考えるべきだということによります。
これこ そ、心理学 ...

出典:Perl manpages Last change: Release 5.0 Patchlevel 00 5