Posted at

正規表現 - 「\A」・「\z」と「^」・「$」の違いを知りたい

More than 1 year has passed since last update.


本で分からなかったことの補足

「PHPしっかり入門教室」を読んでいます。

正規表現の頁に差し掛かって、さっそく分からない部分があったので調べたいと思います。


「\A」・「\z」と「^」・「$」はどう違うのか、どちらを使えばいいのか

「PHPしっかり入門教室」の正規表現の頁を見ると、二者の違いに関してこう書かれています。


文字列の始まりは「\A」以外に「^」、「\z」以外に「$」を使用することもできます。ただし、こちらは行の始まりや終わりを表すので、間に改行コードがあっても無視されます。一方「\z」は改行コードが入る直前を意味しています。


そもそもここで「???」となりました。

なので、こちらのブログ記事を見てみると、『「\A」と「\z」を使いましょう』とあります。

▼正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう | 徳丸浩の日記

記事の例を引用すると、「^」「$」を使用すると

このパターンに対して

/^https?:\/\/[^\n]+$/i

この文字列がマッチしてしまうということです。

javascript:exploit_code();/*

http:/
/hi.com
*/

パターンを見ると、文字列の始まりは『「http」か「https」のどちらか』ということになっています。

文字列を見ると、二行目は合致していますが、一行目が全く外れています。

もうひとつ例を挙げますと

// パターン

// /\Aabc/
abc\ndef
def\nabc

上記の場合、最初のabc\ndefはマッチしますが、

def\nabcはマッチしません。


行先頭で判断するか否か

「^」を使うと、行の先頭に指定の文字列が含まれていればマッチすることになります。

「\A」を使うと、文字列の先頭に指定の文字列が含まれていればマッチすることになります。


つまり

今の段階では「\A」と「\z」を使うのをデフォルトにしておけば良いということなんでしょうかね...。(まずは勉強を続けます(T_T))


参考

▼PHPしっかり入門教室(「翔泳社の本」に飛びます)