转义,特殊字符

正如我们所看到的,一个反斜杠 "\" 是用来表示匹配字符类的。所以它是一个特殊字符。

还存在其它的特殊字符,这些字符在正则表达式中有特殊的含义。它们可以被用来做更加强大的搜索。

这里是包含所有特殊字符的列表:[ \ ^ $ . | ? * + ( )

现在并不需要尝试去记住它们 —— 当我们分别处理其中的每一个时,你自然而然就会记住它们。

转义

如果要把特殊字符作为常规字符来使用,只需要在它前面加个反斜杠。

这种方式也被叫做“转义一个字符”。

比如说,我们需要找到一个点号 '.'。在一个正则表达式中一个点号意味着“除了换行符以外的任意字符”,所以如果我们想真正表示对“一个点号”查询的时候,可以在点号前加一个反斜杠。

alert( "Chapter 5.1".match(/\d\.\d/) ); // 5.1

括号也是特殊字符,所以如果我们想要在正则中查找它们,我们应该使用 \(。下面的例子会查找一个字符串 "g()"

alert( "function g()".match(/g\(\)/) ); // "g()"

如果我们想查找反斜杠 \,我们就应该使用两个反斜杠来查找:

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

一个斜杠

斜杠符号 '/' 并不是一个特殊符号,但是它被用于在 Javascript 中开启和关闭正则匹配:/...pattern.../,所以我们也应该转义它。

下面是查询斜杠 '/' 的表达式:

alert( "/".match(/\//) ); // '/'

从另一个方面看,如果使用另一种 new RegExp 方式就不需要转义斜杠:

alert( "/".match(new RegExp("/")) ); // '/'

使用 new RegExp 创建正则实例

如果我们使用 new RegExp 来创建一个正则表达式实例,那么我们需要对其做一些额外的转义。

比如说,考虑下面的示例:

let reg = new RegExp("\d\.\d");

alert( "Chapter 5.1".match(reg) ); // null

它并没有正常发挥作用,但是为什么呢?

原因就在于字符串转义规则。看下面的例子:

alert("\d\.\d"); // d.d

在字符串中的反斜杠表示转义或者类似 \n 这种只能在字符串中使用的特殊字符。这个引用会“消费”并且解释这些字符,比如说:

  • \n —— 变成一个换行字符,
  • \u1234 —— 变成包含该码位的 Unicode 字符,
  • 。。。其它有些并没有特殊的含义,就像 \d 或者 \z,碰到这种情况的话会把反斜杠移除。

所以调用 new RegExp 会获得一个没有反斜杠的字符串。

如果要修复这个问题,我们需要双斜杠,因为引用会把 \\ 变为 \

let regStr = "\\d\\.\\d";
alert(regStr); // \d\.\d (correct now)

let reg = new RegExp(regStr);

alert( "Chapter 5.1".match(reg) ); // 5.1
教程路线图

评论

在评论之前先阅读本内容…
  • 欢迎你在文章下添加补充内容、提出你的问题或回答提出的问题。
  • 使用 <code> 标签插入几行代码,对于多行代码 — 可以使用 <pre>,对于超过十行的代码 — 建议使用沙箱(plnkrJSBincodepen 等)。
  • 如果你无法理解文章中的内容 — 请详细说明。