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のパターンにマッチします。