正規表現メモ
2008年10月30日
パターン中のメタ文字を纏めてエスケープする
PHP4.3.3以降では、\Q~\Eで囲むとメタ文字を纏めてエスケープできます。
PHP
- preg_match('/^\Q(+*%&)\E$/', '(+*%&)');
部分的にオプションを変更する
(?オプション文字)を使うとオプションの設定と解除が可能です。
PHP
- // 設定
- preg_match('/abc((?i)def)ghi/', 'abcDEFghi', $matches);
- print_r($matches);
- // Array ( [0] => abcDEFghi [1] => DEF )
- // 解除
- preg_match('/abc((?-i)def)ghi/i', 'ABCdefGHI', $matches);
- print_r($matches);
- // Array ( [0] => ABCdefGHI [1] => def )
部分的にキャプチャを避ける
(?:)を使うとサブパターンがキャプチャされなくなります。
PHP
- preg_match('/(?:say) (hello)/', 'say hello', $matches);
- print_r($matches);
- // Array ( [0] => say hello [1] => hello )
キャプチャにキーを指定する
(?P<キー名>パターン)でキーを指定できます。
PHP
- preg_match('/say (?P<key>hello)/', 'say hello', $matches);
- print_r($matches);
- // Array ( [0] => say hello [key] => hello [1] => hello )
先読み言明
ある文字の直後を限定します。
言明パターンはキャプチャされません。
PHP
- // 肯定: 直後がbarのfoo
- preg_match('/foo(?=bar)/', 'foobar', $matches);
- print_r($matches);
- // Array ( [0] => foo )
- // 否定: 直後がvaa以外のfoo
- preg_match('/foo(?!vaa)/', 'foobar', $matches);
- print_r($matches);
- // Array ( [0] => foo )
戻り読み言明
ある文字の直前を限定します。
言明パターンはキャプチャされません。
PHP
- // 肯定: 直前がfooのbar
- preg_match('/(?<=foo)bar/', 'foobar', $matches);
- print_r($matches);
- // Array ( [0] => bar )
- // 否定: 直前がhoo以外のbar
- preg_match('/(?<!hoo)bar/', 'foobar', $matches);
- print_r($matches);
- // Array ( [0] => bar )
繰り返し指定の再試行をキャンセル
サブパターン中に*、+、{}によって繰り返しが指定されている場合、その続きのマッチングに失敗すると、繰り返し部分の桁が調整され、再度マッチングが行われます。この繰り返しが無駄だと分かっている場合には、再試行無しのサブパターン(?>)を使ってキャンセルできます。
このパターンもキャプチャされません。
PHP
- // 再試行あり
- preg_match('/(\d+)bar/', '0123456789foo');
- // 再試行なし
- preg_match('/(?>\d+)bar/', '0123456789foo');
パターン中の後方参照
パターン内部で前の部分でマッチした文字を参照したい場合は、\1の形で参照できます。$1は使えません。
mオプション
複数行を単一行とみなせるmオプションは行を改行コードLFで判断しているので、Windowsでは末尾を表す$マークの扱いに注意する。最後の文字は改行手前の文字ではなくCRとなる。







