在正则表达式范围中转义点号

102

这两个正则表达式的作用相同:

var str = "43gf\\..--.65";

console.log(str.replace(/[^\d.-]/g, ""));
console.log(str.replace(/[^\d\.-]/g, ""));

在第一个正则表达式中,我没有转义点号(.),而在第二个正则表达式中我转义了它(\.)。
有什么区别?为什么结果是相同的?
4个回答

125

在字符类[]中,点运算符.无需转义。


80

由于点号在字符类中(方括号[]内),所以它代表匹配除换行符以外的任何单个字符。

请看http://www.regular-expressions.info/reference.html,在字符类一节中写道:

除了^-]之外的任何字符都可以作为字符类的可能匹配项。


7
如果减号(-)位于范围的中间,则只需要对其进行转义。 - gdoron
4
如果您想匹配连字符,请在左方括号后立即加上它,例如[-A-Z]。否则,连字符将指定范围。这在您的情况下可能有效,只因为您在正则表达式中未指定范围,但我建议您按照参考示例操作,以防稍后需要添加范围。 - usoban
3
或者在闭括号之前立即返回,或者您可以用斜杠进行转义。 - Code Jockey

51

如果您使用JavaScript测试正则表达式,请尝试使用\\.而不是\.

这样做的效果是相同的,因为JS会删除第一个反斜杠。


5
今天我被这个救了。我想不通为什么这个表达式不起作用。谢谢。 - Mārtiņš Radiņš

5
regular-expressions.info 上有这样一句话:

请记住,点号在字符类内部不是元字符,因此我们不需要用反斜杠转义它。

所以我想转义它是不必要的...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接