原文链接:https://javascript.info/regexp-escaping,translate with ❤️ by zhangbao.

我们已经看到,反斜杠”\“用来表示字符类,所以它是个特殊字符。

还有其他的一些特殊字符,在正则表达式中它们有特殊的含义。它们用来进行更加强大的查找任务。

这里列举了完整的名单:[ \ ^ $ . | ? * + ( )

不要试图去记住他们——当我们对它们中的每个单独讲解后,你就会在心里自动记住它们。

转义

将一个特殊字符当作常规字符对待,要在它们之前加上反斜杠。

这称之为”转义字符”。

例如,我们需要查找一个点”.“。在常规的正则表达式里,点表示”除了换行符之外的任意一个字符”,如果想要真正去找”一个点”,就需要在前面放上一个反斜杠:\.

  1. alert( 'Chapter 5.1'.match(/\d\.\d/) ); // ["5.1"]

圆括号也属于特殊字符,所以想要查找它们,就需要用 \(。下面的例子里是查找字符串”g()“:

  1. alert( 'function g()'.match(/g\(\)/) ); // ["g()"]

如果我们查找反斜线的话,就用 \\

  1. alert( '1\\2'.match(/\\/) ); // ["\"]

斜线”/“

斜线不是一个特殊字符,但在 JavaScript 中它用来表示创建正则对象语法的开始和关闭符号:/...pattern.../,所以我们也要转义它。

下面展示了如何查找斜线”/“:

  1. alert( '/'.match(/\//) ); // ["/"]

另一方面,另一个可选的 new RegExp 语法就无需这种转义:

  1. alert( '/'.match(new RegExp('/')) ); // ["/"]

new RegExp

如果我们使用 new RegExp 语法创建一个正则表达式,就需要做更多的转义。

例如:

  1. let reg = new RegExp('\d\.\d');
  2. alert( 'Chapter 5.1'.match(reg) ); // null

但发现不行,为什么呢?

原因是字符串也存在转义规则:

  1. alert( '\d\.\d' ); // d.d

反斜线在字符串里用作转义,和其他字符组合还可以表示字符串里的特殊字符,像 \n。引号”消费”并解释它们,例如:

  • \n —— 解释为换行符,

  • \u1234 —— 解释为对应的 Unicode 字符,

  • 像不属于特殊字符的组合:如 \d 或者 \z,解释时会简单把前面的反斜线直接删掉。

所以在使用 new RegExp 产生正则表达式的时,字符串里的反斜线参数会被自动移除掉。

  1. let regStr = '\\d\\.\\d';
  2. alert(regStr); // \d\.\d(现在是正确的了)
  3. let reg = new RegExp(regStr);
  4. alert( 'Chapter 5.1'.match(reg) ); // ["5.1"]

(完)