64
40

More than 5 years have passed since last update.

PHPの正規表現で^$より\A\zがいい理由

Last updated at Posted at 2018-11-14

正規表現のメタ文字とエスケープシーケンスについておさらい。

  • メタ文字 ^: (ハット記号) 検索対象(複数行モードでは行)の始まりを言明
  • メタ文字 $: (ドル記号) 検索対象の終わりあるいは終端の改行文字の前(複数行モードでは行の終わり)を言明
  • エスケープシーケンス \A: 検索対象文字列の始端(複数行モードとは独立)
  • エスケープシーケンス \z: 検索対象文字列の終端(複数行モードとは独立)

言明 \A, \Z, \z は、(アンカー で説明する)ハット記号やドル記号とは 異なり、オプション設定によらず、文字列の始端または終端だけに マッチします。これらの言明は、PCRE_MULTILINE および PCRE_DOLLAR_ENDONLY オプションの影響を受けません。 \Z と \z との違いは、 \Z は文字列の末尾の改行の前の位置および文字列の 終端にマッチするのに対し、\z は文字列の終端にのみ マッチすることです。

つまり、文字列全体の始端と終端の意図で^$を使っているなら、\A\zのほうが厳密だよ、とういこと。

assert(preg_match('/^hello$/', 'hello') === 1);
assert(preg_match('/^hello$/', "hello\n") === 1); // 末尾に改行(LF)がある文字列が通る(意図と違う動き)
assert(preg_match('/\Ahello\z/', "hello") === 1);
assert(preg_match('/\Ahello\z/', "hello\n") === 0); // 末尾に改行があると通らない(意図通り)

参考

64
40
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
64
40