Perl互換正規表現

注意

マルチバイト環境の \w は [a-zA-Z0-9_] ではない

\wは単語のまとまりにマッチなのでシングルバイト環境では [a-zA-Z0-9_] にマッチするが
マルチバイト環境ではカタカナひらがな漢字などの文字列にもマッチする。
同様に \w に関連する \W \b などもそれに準じる。

パターン修飾子

デミリタの右につけてマッチングの意味を修飾する。

i
英字の大文字・小文字区別なくマッチする
preg_match('/AB/i',$str); // AB Ab aB ab にマッチする
m
複数行として解釈する。
"/^.+$/" とした場合にデフォルトでは文字列の先頭と末尾にマッチだが
"/^.+$/m" だと改行を区切りとした行頭と行末にそれぞれマッチする。
// 空行以外にマッチし抽出する
$lines = "abc\ndef\n\nxyz\n";
preg_match_all('/^.+$/m',$lines,$m);
var_dump($m); // $m[0] = array("abc","def","xyz")
s
デフォルトでピリオド "." は改行以外の文字にマッチだが、s指定するとすべての文字にマッチする
x
e
A
D
S
U
X
J
u
UTF8エンコード文字列をとして解釈する(Perl非互換)

メタ文字

文字の出現回数・種類・区分けなど

  • 最長マッチ最短マッチについて。
    パターンマッチする文字列の長さを最小にするか最大にするかの違いがあります。
    基本的にデフォルトは「貪欲に」最長マッチを行います。
    "/.*/"とした場合、改行までの最長の文字列を拾おうとします。
    できるだけ短くしたい場合はメタ文字の後に ? をつけます。
  • 「0 回の繰り返し」とはつまりその文字が「ない」場合。
    /ab?c/
    は「abc」にマッチするし、b がない時の「ac」にもマッチする。
\多目的に使う一般的なエスケープ文字
^直後の文字が先頭
パターン修飾子 m の複数行モードでは行頭
$直前の文字が末尾
パターン修飾子 m の複数行モードでは行末
.改行を除くすべての文字にマッチ
パターン修飾子 s の場合はすべてにマッチ
|選択枝の開始。これで区切った要素を1つずつの選択候補としてマッチさせる
(A|B|C) は [ABC] と同等。
[abc]文字クラス。abc のどれか1つにマッチ
[^abc]文字クラスの否定。abc以外にマッチ
[a-z]文字クラスの範囲指定。a から z までのどれか1つにマッチ
[^a-z]文字クラスの範囲指定をさらに否定。a から z 以外にマッチ
?最長マッチ。直前の文字の 0(空文字列)または 1 回の繰り返し
*最長マッチ。直前の文字の 0 回以上の繰り返し
+最長マッチ。直前の文字の 1 回以上の繰り返し
{m,n}最長マッチ。量指定子。直前の文字の m 回以上 n 回以下の繰り返し
{m,}最長マッチ。量指定子。直前の文字の m 回以上の繰り返し
{,n}最長マッチ。量指定子。直前の文字の n 回以下の繰り返し
??最短マッチ。直前の文字の 0(空文字列)または 1 回の繰り返し
*?最短マッチ。直前の文字の 0 回以上の繰り返し
+?最短マッチ。直前の文字の 1 回以上の繰り返し
{m,n}?最短マッチ。量指定子。直前の文字の m 回以上 n 回以下の繰り返し
{m,}?最短マッチ。量指定子。直前の文字の m 回以上の繰り返し
{,n}?最短マッチ。量指定子。直前の文字の n 回以下の繰り返し
(ABC)サブパターン。丸カッコ () で区切った範囲は個別にグループ化される。この場合はABCにマッチする。
サブパターン内を後方参照したりマッチングの結果を変数に格納(キャプチャ)できる。
キャプチャできる値は最大 99、キャプチャの有無に関わらずサブパターンは最大200。
直後に ? をつけた (? で始まるサブパターンはさらに続く文字に応じて特殊な意味を持つ。
(?:ABC)ABC でグループ化したサブパターンだが、変数に格納せず後方参照の候補にならない。
preg_match('/(?:ABC)/',$str,$m) > 0 が真でも $m[1] に値はセットされない。
A(?i)BC内部オプション設定。パターン修飾子 i を使い、ABC Abc ABc AbC にマッチする
((?s).+)内部オプション設定。パターン修飾子 s を使い、改行を含むすべての1文字以上の連続にマッチする(空でなければ真)
ABC(?!DEF)後方に DEF がない ABC にマッチ
(?!ABC)DEF前方に ABC がない DEF にマッチ

エスケープシーケンス

文字をまとめたり代用して表現する。

文字のエスケープ

メタ文字やデリミタなど「正規表現で意味のある文字」を無効化(エスケープ)する。

\\文字としての \
\*文字としての *
\?文字としての ?
以下略
preg_match('#abc\#ABC#',$str); // 真ん中のデリミタではない # の意味を無効化

preg_match('#abc\.ABC#',$str); // メタ文字 . を無効化

非表示文字の表記やコードの直接指定

\a0x07アラーム、ベル文字
\cx-"control-x", ここで x は任意の文字
\e0x1bエスケープ文字 ESC
\f0x0c改ページ FF(formfeed)
\n0x0a改行 NL(newline)
\p{xx}-xx プロパティを持つ文字、詳細は unicode プロパティ を参照
\P{xx}-xx プロパティを持たない文字、詳細は unicode プロパティ を参照
\r0x0d復帰 CR(carriage return)
\t0x09タブ
\xhh0xhhhh が2桁の16進コード
\0oo0oooo が2桁の8進コード
\ddd-3桁の8進コード、もしくは後方参照
  • 「\数字」のパターンは解釈がややこしい。
    後方参照により()で囲んだサブパターンに応じた \数字 がマッチできる
    // 2文字の連続を抽出
    preg_match('/(\w{2})\1/','ABCABCabab01230123',$maches);
    echo $maches[0],PHP_EOL;	// abab
    しかし対応する()のない \数字 は8進数コードとして解釈されることもある。
  • \12345 のように \ の後に続く数字は最大で3桁までしか解釈されない
    つまり \12345 は「\123」というコードと「45」という数字文字列に分かれる。
  • \012 のように先頭に 0 がついた2桁以上の数字は8進数コードとして確定できる。
    ただし \ に続く数字は3桁までしか見てくれないので
    \0377 のように書いても「\037」と「7」に分解されてしまうため「\377」と書く必要がある。

包括的な文字型

文字の集合を表現する。

表記意味
\d[0-9]10 進数字
\D[^0-9]10 進数字でない文字
\h[\t \xa0]水平方向の空白文字。TAB SP NBSP(No Break Space HTML特殊文字での  ) (PHP 5.2.4 以降)
\H[^\t \xa0]水平方向の空白文字でない文字 (PHP 5.2.4 以降)
\s[ \t\r\n]空白文字 TAB CR LF
\S[^ \t\r\n]空白文字でない文字
\v[\n\x0b\f\x85]垂直方向の空白文字。LF VT(垂直タブ) FF NEL(カーソルを次の行の先頭に移す制御コード) (PHP 5.2.4 以降)
\V[^\n\x0b\f\x85]垂直方向の空白文字でない文字 (PHP 5.2.4 以降)
\w単語構成文字 (word character)。マルチバイト環境ではカタカナひらがななどにもマッチする
\W非単語構成文字 (non-word character) \wの逆

簡単な言明 (assertion)

\b単語境界。ここでの「単語」とは \w で構成される文字列で、単語は \W で区切られていると考える。
/\bABC/ なら文字列の先頭の ABC もしくは \W の直後の ABC にマッチし、AABC などにはマッチしない。
また、文字クラス内での \b はバックスペース文字として扱われる
\B非単語境界。\b ではない文字
/ABC\B/ なら末尾の ABC もしくは \W の直前の ABC にマッチし、ABCC などにはマッチしない。
\A直後の文字が始端
パターン修飾子 m の複数行モードの影響を受けない
\Z直前の文字が終端もしくは終端の改行文字
パターン修飾子 m の複数行モードの影響を受けない
\z直前の文字が終端
パターン修飾子 m の複数行モードの影響を受けない
\Gマッチングの開始位置。検索開始オフセットを 0 以外に指定した場合は \A と効果が異なる

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規新規下位 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-09-12 (月) 15:32:13 (2203d)