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