web-dev-qa-db-ja.com

正規表現の範囲でドットをエスケープする

何らかの理由で、これらの2つの正規表現は同じように動作します。

"43\\gf..--.65".replace(/[^\d.-]/g, "");​  // 43..--.65
"43\\gf..--.65".replace(/[^\d\.-]/g, "");​  // 43..--.65

デモ

最初の正規表現ではdot(.)をエスケープしませんが、2番目の正規表現ではdo(\.)をエスケープします。

違いは何ですか、なぜ同じように振る舞いますか?

63
gdoron

ドットは文字クラス内にあるため(角括弧[])。

http://www.regular-expressions.info/reference.html を見てください。(charクラスセクションの下):

^-] \以外の任意の文字は、その文字を文字クラスの可能な一致に追加します。

54
usoban

ドット演算子.は、文字クラス[]内でエスケープする必要はありません。

91
jbabey

JavaScriptを使用して正規表現をテストする場合は、\\.の代わりに\.を試してください。

JSが最初のバックスラッシュを削除するため、同じように動作します。

24
MMiroslav

このWebページ では、次のことがわかります。

「ドットは文字クラス内のメタ文字ではないため、バックスラッシュでエスケープする必要はありません。」

だから私はそれをエスケープする必要はないと思う...

4
Rob I