PERLRE(1) USER COMMANDS PERLRE(1) NAME perlre - Perl の正規表現 DESCRIPTION マッチ演算子においてどのように正規表現を使うかについての説明 は、perlop manpage の m// や s/// を参照してください。 マッ チ演算子は、いくつかの修飾子をとり、中の正規表現の解釈の仕方 を変更することができます。 修飾子には、 i 大文字小文字の区別をしないパターンマッチを行なう。 m 文字列を複数行として扱う。 s 文字列を単一行として扱う。 x 拡張正規表現を使用する。 があります。 これらは通常、使用する区切り文字にスラッシュ以 外のものを使うときでも、「/x 修飾子」のように書かれます。 実際には、これらの修飾子は、(?...) という新しい形式で正規表 現の中に埋め込んでしまうこともできます。 これについては、あ とで述べます。 /x 修飾子について、もう少し説明しておきましょう。 これは、 正規表現のパーザに、バックスラッシュでエスケープされている空 白、文字クラス内で使われている空白以外の空白を無視するように 指示するものです。 これを使えば、正規表現を (少しは) 読みや すい単位に分割して使うことができるでしょう。 あとで述べる、 埋め込みコメントの機能とともに、Perl 5 を読みやすい言語にす ることに貢献しています。 perlop manpage にあげた C のコメン トを削除する例を参照してください。 正規表現 パターンマッチで用いるパターンは、Version 8 regexp ルーティ ンで提供されているような正規表現です。 (実際、使用している ルーティンは、Henry Spencer が書き直した再配布可能な V8 の ルーティンを元にしています。) 詳しくは、「Version 8 正規表 現」の節を参照してください。 特に、以下のメタ文字は、標準的な egrep(1) と同様の意味を表わ します: \ 次のメタ文字をクォートする ^ 行の最初にマッチする . (改行以外の) すべての文字にマッチする $ 行の終わりにマッチする | 選択 () グループ化 [] 文字クラス デフォルトでは、文字 "^" は文字列の最初にだけ、文字 "$" は最 後 (もしくは、最後の改行の前) にだけマッチすることが保証され ており、Perl は文字列には 1 行だけが含まれていると仮定して、 最適化を行ないます。 文字列の中に埋め込まれた改行は、"^" や Perl manpages Last change: Release 5.0 Patchlevel 00 1 PERLRE(1) USER COMMANDS PERLRE(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 回以下にマッチ パターンはダブルクォート文字列として処理されますから、 Perl manpages Last change: Release 5.0 Patchlevel 00 2 PERLRE(1) USER COMMANDS PERLRE(1) \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 か所でしかマッチしないことを除いて "^" と "$" と同じ事になります。 "^" と "$" は内部的な行の境界にもマッ チします。 Perl manpages Last change: Release 5.0 Patchlevel 00 3 PERLRE(1) USER COMMANDS PERLRE(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 manpages Last change: Release 5.0 Patchlevel 00 4 PERLRE(1) USER COMMANDS PERLRE(1) 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) を付け加えればよいのです。 たとえば: Perl manpages Last change: Release 5.0 Patchlevel 00 5 PERLRE(1) USER COMMANDS PERLRE(1) $pattern = "foobar"; if ( /$pattern/i ) # パターンに埋め込めば、より柔軟: $pattern = "(?i)foobar"; if ( /$pattern/ ) この構文や新しい最短一致の構文にクエスチョンマークを選らんだ のは、1) 以前の正規表現においてクエスチョンマークが使われる ことが少なかったこと、2) これを見つけた人は「疑問」に思って なにが起こるのかを考えるべきだということによります。 これこ そ、心理学 ... Version 8 正規表現 万が一、みなさんが「正規の」Version 8 正規表現ルーティンを知 らなかった場合のために、これまでに書いていないパターンマッチ の規則を示します。 ある 1 文字は、その文字がこの節かこれまでに示した「メタ文字」 でない場合には、その文字自身にマッチします。 通常はメタ文字 として働く文字も、前に "\" を付けることで、文字通りに解釈さ れるようにすることができます。 (たとえば、"\." は任意の 1 文字ではなく、"." という文字にマッチします。) 文字の並びは、 対象の文字列の中の同じ文字の並びにマッチしますから、blurfl というパターンは、対象となる文字列の "blurfl" にマッチします。 文字のリストを [] で囲って、そのリストのいずれかの文字にマッ チする、文字クラスを指定することができます。 "[" に続く最初 の文字が "^" であれば、その文字クラスは、リストに無い文字に マッチするようになります。 リストの中では、"-" が範囲を示す のに使われ、a-z は "a" から "z" までのすべての文字を表わしま す。 C で使われているのと非常によく似たメタ文字構文を使って、文字 を指定することができます。 "\n" が改行、"\t" がタブ、"\r" が復帰、"\f" が改ページといった具合です。 さらに一般的には、 nnn を 8 進数の数字として、\nnn は ASCII 値が nnn の文字にマ ッチします。 同様に、nn を 16 進数の数字として、\xnn は ASCII 値が nn の文字にマッチします。 \cx という式は、ASCII 文字 control-x にマッチします。 最後に、メタ文字 "." は (/s を使っているときを除いて) "\n" を除くどんな文字にもマッチし ます。 "|" で区切ることで、パターンの選択肢を示すことができますから、 fee|fie|foe は、対象の文字列の "fee" か "fie" か "foe" のい ずれかにマッチします (f(e|i|o)e と同じ)。 最初の選択肢には、 最後の区切文字 ("(" か "[" かパターンの始め) の後から最初の Perl manpages Last change: Release 5.0 Patchlevel 00 6 PERLRE(1) USER COMMANDS PERLRE(1) "|" の前までが含まれ、最後の選択肢には、最後の "|" の後から 次のパターンの区切文字の前までが含まれます。 この事から、最 初と最後をはっきりさせるために、選択肢を括弧に入れることがよ く行なわれます。 (fee|fie|foe) というパターンは、 [fee|fie|foe] というパターンとは違うことに注意してください。 前者が対象文字列の "fee" か "fie" か "foe" にマッチするのに 対して、後者は [fee] か [fie] か [foe] のいずれかの文字クラ スにマッチするものにマッチします (つまり、文字クラス [feio] です)。 パターンではあとで参照するために、括弧で括ってサブパターンを 指定でき、そのパターンの中で n 番目のサブパターンを \n とい うメタ文字で参照することができます。 サブパターンは、左から 右に向かって、開き括弧に対して番号がつけられます。 後方参照 は、サブパターンが調べられる文字列中で、実際にマッチしたもの にマッチするのであって、そのサブパターン規則そのものにマッチ するのではありません。 ですから、([0|0x])\d*\s\1\d* という パターンは、"0x1234 0x4321" にマッチしますが、"0x1234 01234" にはマッチしません。 たとえ [0|0x] という規則が 2 番目の数 字の前の 0 にマッチすることができるとしても、サブパターン 1 は、"0x" にマッチしたものだからです。 Perl manpages Last change: Release 5.0 Patchlevel 00 7