Perl/正規表現

Perl > Perl/正規表現
Perlは強力な 正規表現 をサポートしています。正規表現とは、大まかにいうと、検索の機能を高度化しやすくしたものです。Perl以外のJavaやJavaSciptやPHPなども正規表現をサポートしていますが、Perlは古くから正規表現を本格的にサポートしています。 また、Perlの拡張正規表現は、Perl Compatible Regular Expressions( PCRE ) としてPerlの外でも使うことができるため、正規表現のディファクトスタンダードの1つとなっています。
二項演算子 =~ は、左辺のスカラー式を右辺のパターンマッチに拘束します。 正規表現に関する操作では、デフォルトで $_ という文字列を検索したり変更したりします。 この演算子は、そのような操作を他の文字列に対して行うようにします。 右辺は、検索パターン(//)、置換(s///)、または変換(tr///)です。 左辺は、デフォルトの$_の代わりに検索、置換、または変換されるはずのものです。 スカラーコンテキストで使用する場合、返り値は通常操作の成功を表します。 リストコンテキストでの動作は、特定の演算子に依存します。
!~は、=~の論理反転バージョンです。
=~は、右辺に s/// を取ると左辺を置換える。
=~は、右辺に tr/// を取ると左辺を変換する。
m を前置すると正規表現を囲う記号にスラッシュ以外を用いることができます。 [ ], ( ), < >, { } などの括弧は開き括弧と閉じ括弧が対応するように用います。
囲み記号にシングルクォーテーションを用いると、変数やエスケープシーケンスが評価されるのを防ぐことができます。
文字クラスは、文字の集合を、その集合の中の1文字にマッチするように表現する方法です。 ここで重要なのは、文字クラスのマッチングはソース文字列のちょうど一文字を消費するということです(ソース文字列とは、正規表現がマッチされる文字列のことです)。
Perlの正規表現には、ドット、バックスラッシュ・シーケンス、角括弧で囲まれた文字クラスの3種類の文字クラスがあります。 しかし、「文字クラス」という用語は、しばしば角括弧で囲まれた形式だけを意味するものとして使われることがあるので、文脈によりどちらを表しているのか注意が必要です
ドット.は、デフォルトでは、ドットは改行を除く全ての1文字にマッチします。
正規表現において特殊な意味を持つ以下の文字をメタキャラクターと呼びます。
これらの文字自身をあらわすには \+, \* のようにバックスラッシュでエスケープします。
アンカーとは長さを持たない正規表現です。
代表的なものに、文字列先頭にマッチする ^、文字列末尾にマッチする $ があります。
文字列「Wiki」は検索対象の先頭にあるのでマッチします。
文字列「books」は検索対象に含まれて居いますが、しかし先頭には無いのでマッチしないのです。
他に、単語の境界(正確には、単語の先頭あるいは末尾)にマッチする \b、それ以外の部分にマッチする\B があります。
つまり、その位置に半角スペースまたは単語の先頭あるいは終わりがある場合に、マッチすることになります。
dogのgの後ろに半角スペースがあるので、結果はマッチです。

catのなかに「a」がありますが、位置が単語の境界ではないので、マッチしません。
バックスラッシュ・シーケンスとは、最初の1文字がバックスラッシュである文字の並びのことです。Perlはこのような多くのシーケンスに特別な意味を持たせており、そのうちのいくつかは文字クラスになっています。つまり,その文字がシーケンスで定義された特定の文字集合に属していれば,それぞれ1つの文字にマッチします。
/[ ]/ のように、スラッシュの内側をブラケットで囲んだ部分は角括弧で囲まれた文字クラスです。
/[ - ]/ のように、文字クラス/[ ]/の中においてハイフン (-) を用いることにより、文字の範囲を指定することができます。
たとえば、/[a-z]/ と書けば、英語の小文字にマッチします。(なお Perl の正規表現では、大文字と小文字を区別します。)
あるいは /[0-9]/ と書けば、十進数の数字にマッチします。

ハイフンの前の文字は、後ろの文字よりも文字コードにおいて前でなければなりません。
ハイフン自体を文字クラスに含めるには、文字クラスの一番前か一番後ろに記述するか、バックスラッシュでエスケープします。(なお、Windows環境では表示で、バックスラッシュの代わりに、通貨記号の円マークが表示されるかもしれません。)
開きブラケット ([) に ^ を後置すると、否定キャラクタクラスを表現することができます。
丸括弧で括った部分はグループ化されます。
グループ化した部分は後から参照することができます。これを後方参照といいます。 同じ正規表現内で後方参照を行うには、\1, \2... を用います。
また、正規表現外で後方参照を行うには、スカラー変数 $1, $2... を用います。
縦線を用いると正規表現を選択することができます。
下記の書式例では、^ や $ が | よりも優先順位が高いため、abc で始まる文字列か def で終わる文字列にマッチします。

先頭と末尾の両方に接する「"abc"」か 「"def"」だけにマッチさせるには以下のようにします。


s///演算子を用いると、文字列の置換を行うことができます。
m//と同じく、スラッシュ以外の記号を用いることもできます。
正規表現のメタキャラクター、あるいはパターンマッチそのものの振る舞いを変えるために、修飾子を指定することができます。たとえば、正規表現がアルファベットの大文字小文字を区別せずにマッチするようにするためには、
のように、最後のスラッシュ(あるいは何らかの記号)の後に、i修飾子を付加します。
x修飾子を付けると正規表現内の空白や改行が無視され、「#」以降はコメントとして扱われます。
「ABC」や「[0-9]」、「.*?」のように、何かにマッチする正規表現の構文をアトムといいます。最後の「.*?」は、アトム「.」に量指定子「*」、「?」が付いたもので、特に量指定子付きアトムといいます。
「^」や「$」、「|」のように、何かにマッチするわけではない正規表現の構文をアサーションといいます。
正規表現の構文は基本的にアトムとアサーションのどちらかに分けられます。ただし、\Qや\E、\uや\Uのような特殊なシーケンスはアトムでもアサーションでもありません。これらは構文のふるまいを変えるものです。
(?:...)はクラスタ化(正規表現をまとめること)のみに使われるカッコです。キャプチャを行わないため、マッチした部分を正規表現の中で\1、\2のように参照したり、後から$1、$2のような変数で参照したりすることができません。キャプチャを行う必要がない場合は、このカッコを使うことで効率化を図ることができます。
これにはimsx修飾子を付けることもできます。i修飾子を付けるには、i-msx(iを指定しmsxを指定しない)とします。
単に修飾子を有効または無効にするためだけにこのカッコを使うこともできます。
ルックアラウンドアサーションとは、直後または直前にパターンが出現すること、あるいは出現しないことを確認し、確認するだけで何にもマッチしないアサーションです。
直後にPATTERNが出現することを確認します。
直後にPATTERNが出現しないことを確認します。
次の例では、「&amp;」以外の「&」をすべて「&amp;」に置換します。
直前にPATTERNが出現することを確認します。
直前にPATTERNが出現しないことを確認します。
バックトラックしないPATTRENにのみマッチします。
(?{ CODE })という形で、正規表現の中にPerlのコードを埋め込むことができます。
(??{ CODE })という形では、CODEを評価した結果得られた正規表現にマッチします。
Perlの条件演算子?:のように、条件が真か偽かでマッチさせるパターンを変えることができます。
または
CONDが真の場合はTRUE、偽の場合はFALSEのパターンにマッチします。