正規表現メモ

パターン中のメタ文字を纏めてエスケープする

PHP4.3.3以降では、\Q~\Eで囲むとメタ文字を纏めてエスケープできます。

PHP

  1. preg_match('/^\Q(+*%&)\E$/''(+*%&)');

部分的にオプションを変更する

(?オプション文字)を使うとオプションの設定と解除が可能です。

PHP

  1. // 設定
  2. preg_match('/abc((?i)def)ghi/''abcDEFghi', $matches);
  3. print_r($matches);
  4. // Array ( [0] => abcDEFghi [1] => DEF )
  5. // 解除
  6. preg_match('/abc((?-i)def)ghi/i''ABCdefGHI', $matches);
  7. print_r($matches);
  8. // Array ( [0] => ABCdefGHI [1] => def )

部分的にキャプチャを避ける

(?:)を使うとサブパターンがキャプチャされなくなります。

PHP

  1. preg_match('/(?:say) (hello)/''say hello', $matches);
  2. print_r($matches);
  3. // Array ( [0] => say hello [1] => hello )

キャプチャにキーを指定する

(?P<キー名>パターン)でキーを指定できます。

PHP

  1. preg_match('/say (?P<key>hello)/''say hello', $matches);
  2. print_r($matches);
  3. // Array ( [0] => say hello [key] => hello [1] => hello )

先読み言明

ある文字の直後を限定します。
言明パターンはキャプチャされません。

PHP

  1. // 肯定: 直後がbarのfoo
  2. preg_match('/foo(?=bar)/''foobar', $matches);
  3. print_r($matches);
  4. // Array ( [0] => foo )
  5. // 否定: 直後がvaa以外のfoo
  6. preg_match('/foo(?!vaa)/''foobar', $matches);
  7. print_r($matches);
  8. // Array ( [0] => foo )

戻り読み言明

ある文字の直前を限定します。
言明パターンはキャプチャされません。

PHP

  1. // 肯定: 直前がfooのbar
  2. preg_match('/(?<=foo)bar/''foobar', $matches);
  3. print_r($matches);
  4. // Array ( [0] => bar )
  5. // 否定: 直前がhoo以外のbar
  6. preg_match('/(?<!hoo)bar/''foobar', $matches);
  7. print_r($matches);
  8. // Array ( [0] => bar )

繰り返し指定の再試行をキャンセル

サブパターン中に*、+、{}によって繰り返しが指定されている場合、その続きのマッチングに失敗すると、繰り返し部分の桁が調整され、再度マッチングが行われます。この繰り返しが無駄だと分かっている場合には、再試行無しのサブパターン(?>)を使ってキャンセルできます。
このパターンもキャプチャされません。

PHP

  1. // 再試行あり
  2. preg_match('/(\d+)bar/''0123456789foo');
  3. // 再試行なし
  4. preg_match('/(?>\d+)bar/''0123456789foo');

パターン中の後方参照

パターン内部で前の部分でマッチした文字を参照したい場合は、\1の形で参照できます。$1は使えません。

mオプション

複数行を単一行とみなせるmオプションは行を改行コードLFで判断しているので、Windowsでは末尾を表す$マークの扱いに注意する。最後の文字は改行手前の文字ではなくCRとなる。

参考文献

PHPパターン構文

コメントは受け付けていません。