22
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

文字列リテラルで正規表現を書くときのバックスラッシュ

Last updated at Posted at 2013-07-11

たまに文字列リテラルでの正規表現の書き方を間違っている人を見かけます。

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 だとバッククオートの中でも \ がエスケープされるのだけどそういうものなの?

22
15
6

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
22
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?