【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, … ) |
$& | マッチした文字列全体 |
$` | マッチした文字列の前にあるすべての文字列 |
$’ | マッチした文字列の後にあるすべての文字列 |
コメント
コメントを何かしらの理由でパターンマッチで使いたい場合には、
(?# で始まり、閉じカッコで括ります。
カッコのネストはできません。
コメント内の文字は、パターンマッチには全く関係しません。