【PHP5】正規表現(Perl 互換)

正規表現(Perl 互換)

正規表現とは、文字列の一部をパターン化して各種処理をする手法です。
この記事では、Perl 互換の preg 系について書いています。

PCRE 関数

PCRE 関数として以下の関数が実装されています。

preg_match:正規表現によるマッチングを行う
preg_match_all:繰り返し正規表現検索を行う
preg_grep:パターンにマッチする配列の要素を返す

preg_replace:正規表現検索および置換を行う
preg_filter:正規表現による検索と置換を行う
preg_replace_callback:正規表現検索を行い、コールバック関数を使用して置換を行う
preg_replace_callback_array:正規表現検索を行い、コールバック関数を使用して置換を行って配列の要素を返す

preg_split:正規表現で文字列を分割する

preg_quote:対象文字列に含まれる特殊文字「. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -」の前にバックスラッシュを挿入します。

preg_last_error:直近の PCRE 正規表現処理のエラーコードを返す

http://php.net/manual/ja/ref.pcre.php

パターン修飾子

PCRE 関数では、パターン修飾子が実装されています。
主なものとして以下のような修飾子があります。

※Perl などにある修飾子「g」は、PHP では用意されていません。
パターンマッチでは preg_match_all 関数を使用します。
また preg_replace 関数などを使用しての置換の場合には、
既定で g 修飾子を指定した場合と同じ動作をします。

修飾子内容
i大文字と小文字の区別をしない (case-insensitive)
m文字列を複数行として扱う (multi-line)
o変数展開を 1 度だけ行う (only once)
s文字列を単一行として扱う (single line)
x拡張正規表現を行う (extended)
uパターンと対象文字列は、 UTF-8 として扱う (PCRE_UTF8)

http://php.net/manual/ja/reference.pcre.pattern.modifiers.php

区切り文字

区切り文字であるスラッシュを
英数字、バックスラッシュ、空白文字以外の任意の文字に置き換えることもできます。

構文内容
[区切文字] パターン [区切文字]/パターン/ に同じ

メタ文字

正規表現では、下記の記号をメタ文字として特殊な機能を持たせています。
なので、メタ文字を「文字」としてマッチさせるためには、
直前に \ を付けてエスケープする必要があります。

\ ^ . $ * ? | ( ) [ ] { } +

任意の1文字と位置指定

メタ文字正規表現上の意味
\直後の文字をエスケープ
^先頭にマッチ
$末尾にマッチ
.改行を除く任意の1文字

パターン論理和

メタ文字正規表現上の意味
|選択

複数の文字列をパイプで分割すると、複数の文字列のどれかにマッチさせます。

パターングループ

メタ文字正規表現上の意味
( )グループ化

複数の文字列をまとめた形でパターンマッチを行います。

文字クラス

メタ文字正規表現上の意味
[ ]指定内の任意表現

マッチングの対象となる文字列中に
[ ] (ブラケット)で囲んだ文字のいずれかをマッチさせます。
ブラケット中の先頭部に「 ^ 」(キャレット)があれば、逆の意味となります。
また、ブラケット中に「 – 」(マイナス)があれば、範囲指定を意味します。

文字クラスで多用されるものとして、次のような表現があります。

文字クラス内容
[a-z]英小文字のいずれか1文字
[A-Z]英大文字のいずれか1文字
[0-9]数字のいずれか1文字
[a-zA-Z0-9]英数字のいずれか1文字
[^a-zA-Z]英字以外にマッチ
[^0-9]数字以外にマッチ
[:alnum:][:alpha:]+[:digit:]
[:alpha:][:lower:]+[:upper:]
[:lower:]小文字の半角英文字 [a-z]
[:upper:]大文字の半角英文字 [A-Z]
[:digit:]数字 [0-9]
[:blank:]スペースとタブ [ \t]
[:cntrl:]制御文字
[:graph:][:alnum:]+[:punct:]
[:print:][:alnum:]+[:punct:]+スペース
[:punct:]! " # $ % & ' ( ) * + , – . /
[:space:]空白文字 [ \t\n\r\f\v]
[:xdigit:]16進数 [0-9A-Fa-f]

量指定子

メタ文字正規表現上の意味
*直前の文字を 0 回以上にマッチ
+直前の文字を 1 回以上にマッチ
?直前の文字を 0 回又は 1 回にマッチ
{n}直前の文字を n 回にマッチ
{n,}直前の文字を n 回以上にマッチ
{n,m}直前の文字を n 回以上、m 回以下にマッチ

量指定子の正規表現を行う場合、マッチする範囲は最大マッチングとなります。

その他のメタ文字及び特殊変数

前述以外で、他にも正規表現上の特殊な意味として、よく使われるものがあります。

表現正規表現上の意味
\w英字、数字、アンダースコア。[a-zA-Z0-9_] に同じ。
\W英字、数字、アンダースコア以外の文字。[^a-zA-Z0-9_] に同じ。
\d数字。[0-9] に同じ。
\D数字以外の文字。[^0-9] に同じ。
\tタブ
\rリターン(復帰文字)
\n改行
\fラインフィード(改ページ)
\sスペース。[\r\t\n\f] に同じ。
\Sスペース以外の文字。[^\r\t\n\f] に同じ。
\aアラーム(ベル)
\bバックスペース
\eエスケープ
\0 + 数字8 進法で表すASCII文字。( \033, \040 など )
\x + 英数字16 進法で表すASCII文字。(\x1b, \x00 など )
\c[コントロール文字
\l次の 1 文字を小文字にする
\u次の 1 文字を大文字にする
\L\E までの文字列を小文字にする
\U\E までの文字列を大文字にする
\E変更の終わり
\Q\E までの文字列で正規表現のメタ文字を文字にみなす
\b単語の境界にマッチする
\B単語の境界以外にマッチする
\A文字列の最初にマッチする。メタ文字 ^ に同じ。
\Z文字列の最後にマッチする。メタ文字 $ に同じ。
$ + 数字グループ化したパターンを後で参照する。
\ + 数字上記に同じ。( \1, \2, \3, … )
$&マッチした文字列全体
$`マッチした文字列の前にあるすべての文字列
$’マッチした文字列の後にあるすべての文字列

コメント

コメントを何かしらの理由でパターンマッチで使いたい場合には、
(?# で始まり、閉じカッコで括ります。
カッコのネストはできません。
コメント内の文字は、パターンマッチには全く関係しません。

PHP入門

Posted by 管理人