たまに文字列リテラルでの正規表現の書き方を間違っている人を見かけます。
PHP の場合
バックスラッシュ 2 個 \\\\
にマッチする正規表現は \\\\\\\\
ですが、リテラル中だとさらにエスケープしなければならないので \\\\\\\\\\\\\\\\
のように 8 個バックスラッシュが必要です。
<?php
var_dump(!!preg_match('/^\\\\$/', '\\\\')); // bool(false)
var_dump(!!preg_match('/^\\\\\\\\$/', '\\\\')); // bool(true)
ただ PHP の場合 \
の後ろがエスケープシーケンスと解釈されなければ \
のままとなるため .
にマッチする正規表現を文字列リテラルで \.
と書いても大丈夫です。
<?php
var_dump(!!preg_match('/^\.$/', '.')); // bool(true)
var_dump(!!preg_match('/^\.$/', 'x')); // bool(false)
var_dump(!!preg_match('/^\\.$/', '.')); // bool(true)
var_dump(!!preg_match('/^\\.$/', 'x')); // bool(false)
JavaScript の場合
JavaScript でも文字列リテラルで正規表現を書く場合は同じように \
を 2 重にエスケープする必要があります。
console.log(new RegExp('^\\\\$' ).test('\\\\')); // false
console.log(new RegExp('^\\\\\\\\$').test('\\\\')); // true
しかも JavaScript の場合 \
の後ろがエスケープシーケンスと解釈されないと \
が消えてしまうので、.
にマッチする正規表現は \\\\.
とする必要があります。
console.log(new RegExp('^\.$' ).test('.')); // true
console.log(new RegExp('^\.$' ).test('x')); // true
console.log(new RegExp('^\\.$').test('.')); // true
console.log(new RegExp('^\\.$').test('x')); // false
もっとも JavaScript なら正規表現リテラルがあるので、あえて正規表現を文字列リテラルで書く必要はありません。
console.log(/^\.$/.test('.')); // true
console.log(/^\.$/.test('x')); // false
PHP にも正規表現リテラルが欲しいですね・・・ http://d.hatena.ne.jp/anatoo/20130304/1362325689
ところで Qiita だとバッククオートの中でも \
がエスケープされるのだけどそういうものなの?