正規表現

正規表現とは

正規表現(regular expression)とは、文字列のパターンを表現する表記法であり、文字列の検索・置換を行うときに利用されます。

通常の文字と、メタキャラクタと呼ばれる特別な意味を持つ記号を組み合わせて表記します。

文字列を直接指定せず、パターンを指定することができるため、表記の揺れを吸収して検索を行ったり、複数の異なる文字列を一括して置換したりできます。

なお、PHPで使える正規表現には「PCRE(preg_***関数)」と「POSIX(ereg_***関数)」の2種類があります。

詳しくは下記の関数を参考して下さい。

文字列のパターンについて

メタ文字

記号意味
.改行を除く任意の1文字
*0回以上の連続する文字
+1回以上の連続する文字
?0または1回だけの文字
^文字列の先頭
$文字列の末尾
\エスケープ文字
|OR
()パターングループ
[]文字クラス
{}量指定子
\n改行
\rキャリッジリターン
\tタブ
\d数字 [0-9]
\D数字以外 [^0-9]
\w英数字 [_a-zA-Z0-9]
\W英数字以外 [^_a-zA-Z0-9]
\s空白 [ \t \r\f]
\S空白以外 [^ \t\n\r\f]
\b単語境界 \w、\Wの間
\B単語境界以外
\x??16進数

エスケープシーケンス

記号説明
\\\
\n改行
\t水平タブ
\aベル
\bバックスペース
\rキャリッジリターン
\v垂直タブコード
\eエスケープコード
\zエンドオブファイル(EOF)
\"ダブルクオート
\'シングルクオート

文字クラス

記号意味
-範囲
^先頭に置くと以外にマッチ
a-z小文字の半角英文字
A-Z大文字の半角英文字
0-9数字
^0-9数字以外
[:alnum:][:alpha:]+[:digit:]
[:alpha:][:lower:]+[:upper:]
[:lower:]小文字の半角英文字 [a-z]
[:digit:]数字 [0-9]
[:blank:]スペースとタブ [ \t]
[:cntrl:]制御文字
[:graph:][:alnum:]+[:punct:]
[:print:][:alnum:]+[:punct:]+スペース
[:punct:]! " # $ % & ' ( ) * + , - . /
[:space:]空白文字 [ \t\n\r\f\v]
[:upper:]大文字の半角英文字 [A-Z]
[:xdigit:]16進数 [0-9A-Fa-f]

量指定子

記号意味
*0回以上の連続する文字
+1回以上の連続する文字
?0または1回だけの文字
{n}?n回の連続する文字
{n,}?n回以上の連続する文字
{n, m}?n回以上、m回以下の連続する文字

最短マッチ

「*」や「+」の後に「?」を付けると最短マッチになります。

.+?

簡易一覧

文字系

記号意味備考
.任意の1文字
*直前の文字の0回以上の繰り返し最長一致(条件に合う一番長い部分に一致します)
+直前の文字の1回以上の繰り返し最長一致(条件に合う一番長い部分に一致します)
?直前の文字は省略可能最長一致(条件に合う一番長い部分に一致します)
*?直前の文字の0回以上の繰り返し最短一致(条件に合う一番短い部分に一致します)
+?直前の文字の1回以上の繰り返し最短一致(条件に合う一番短い部分に一致します)
??直前の文字は省略可能最短一致(条件に合う一番短い部分に一致します)
[ABC][ ]の中のどれか1文字[ ] 内で正規表現は使えません
[^ABC][ ]の中に無い1文字[ ] 内で正規表現は使えません
(A|B)AかBのどちらか
{n}直前の文字のn回の繰り返し
{min,max}直前の文字のmin以上max以下の繰り返し(min、maxは省略可能)最長一致(条件に合う一番長い部分に一致します)
{min,max}?直前の文字のmin以上max以下の繰り返し(min、maxは省略可能)最短一致(条件に合う一番短い部分に一致します)
\wアルファベット、数字、アンダスコア( _ )のどれかの1文字
\Wアルファベット、数字、アンダスコア以外の1文字
\d数字1文字
\D数字以外の1文字
\s半角スペース、タブ、改行のどれか1文字
\S半角スペース、タブ、改行以外の1文字
\n改行
\tタブ
\\\記号
(ABC)( )内を1文字扱い

位置系

記号意味
^行の先頭
$行の末尾
\<単語の先頭
\>単語の末尾
\b単語の先頭か末尾
\B単語の先頭、末尾以外
\Aファイルの先頭
\zファイルの末尾
\G直前の一致文字列の末尾

置換文字列で使う記号

記号意味
¥0一致した文字列全体
\1, \2 … \9それぞれ検索文字列の1~9番目の ( ) に一致した文字列。具体的には ( が現れる順番
\l次の1文字を小文字にする
\L ~ \E挟まれた文字列を小文字にする
\u次の1文字を大文字にする
\U ~ \E挟まれた文字列を大文字にする
\n改行
\tタブ
\\\記号

サンプル

半角スペースまたはタブコードを0回以上繰り返す

[\x20\t]*

「*」が0回~5回連続する

\*{0,5}

最短一致で改行を除く任意の1文字

.*?

「#」「アルファベット」「英数字・アンダースコア・ハイフンが1文字以上」

\[#([A-Za-z][\w-]+)\]

「半角スペースが0文字以上」「英字(小文字)が1文字以上」「=」「"」「英字が1文字」「英数字が0文字以上」「"」「半角スペースが0文字以上」

/^ *([a-z]+)="([a-zA-Z][a-zA-Z0-9]*)" *$/

説明

  1. 半角スペースが0文字以上(開始文字)
  2. 英字(小文字)が1文字以上(取得する)
  3. 「=」記号
  4. 「"」記号
  5. 英字が1文字&英数字が0文字以上(取得する)
  6. 「"」記号
  7. 半角スペースが0文字以上(終了文字)

使用例

$hoge = 'id="test"';
preg_match(/^ *([a-z]+)="([a-zA-Z][a-zA-Z0-9]*)" *$/, $hoge);

<結果>
$hoge[0] ... id="test"
$hoge[1] ... id
$hoge[2] ... test

参考