1+
12# 转义,特殊字符
2- 正如我们所看到的,一个反斜杠 ` "\" ` 是用来表示匹配字符类的。所以它是一个特殊字符。
33
4- 还存在其它的特殊字符,这些字符在正则表达式中有特殊的含义。它们可以被用来做更加强大的搜索 。
4+ 正如我们所看到的,反斜杠 ` pattern:\ ` 用于表示字符类,例如 ` pattern:\d ` 。所以它是正则表达式中的一个特殊字符(就像在常规字符串中一样) 。
55
6- 这里是包含所有特殊字符的列表: ` pattern:[ \ ^ $ . | ? * + ( ) ` 。
6+ 还存在其它特殊字符,这些字符在正则表达式中有特殊的含义,例如 ` pattern:[ ] { } ( ) \ ^ $ . | ? * + ` 。它们用于执行更强大的搜索 。
77
8- 现在并不需要尝试去记住它们 —— 当我们分别处理其中的每一个时,你自然而然就会记住它们 。
8+ 现在并不需要尝试记住它们 —— 当我们分别学习它们的时候,你自然而然就会记住了 。
99
1010## 转义
1111
12- 如果要把特殊字符作为常规字符来使用,只需要在它前面加个反斜杠 。
12+ 假如我们想要找到一个点号 ` . ` 。
1313
14- 这种方式也被叫做“转义一个字符” 。
14+ 要将特殊字符用作常规字符,请在其前面加上反斜杠: ` pattern:\. ` 。
1515
16- 比如说,我们需要找到一个点号 ` pattern:'.' ` 。在一个正则表达式中一个点号意味着“除了换行符以外的任意字符”,所以如果我们想真正表示对“一个点号”查询的时候,可以在点号前加一个反斜杠 。
16+ 这就是所谓的“转义字符” 。
1717
18+ 例如:
1819``` js run
19- alert ( " Chapter 5.1" .match (/ \d \. \d / ) ); // 5.1
20+ alert ( " Chapter 5.1" .match (/ \d \. \d / ) ); // 5.1(匹配了!)
21+ alert ( " Chapter 511" .match (/ \d \. \d / ) ); // null(寻找一个真正的点 \.)
2022```
2123
22- 括号也是特殊字符,所以如果我们想要在正则中查找它们 ,我们应该使用 ` pattern:\( ` 。下面的例子会查找一个字符串 ` "g()" ` :
24+ 括号也是特殊字符,所以如果我们想要查找它们 ,我们应该使用 ` pattern:\( ` 。下面的例子会查找一个字符串 ` "g()" ` :
2325
2426``` js run
2527alert ( " function g()" .match (/ g\(\) / ) ); // "g()"
2628```
2729
28- 如果我们想查找反斜杠 ` \ ` ,我们就应该使用两个反斜杠来查找 :
30+ 如果我们想查找反斜杠 ` \ ` ,我们就应该使用两个反斜杠 :
2931
3032``` js run
3133alert ( " 1\\ 2" .match (/ \\ / ) ); // '\'
3234```
3335
3436## 一个斜杠
3537
36- 斜杠符号 ` '/' ` 并不是一个特殊符号 ,但是它被用于在 Javascript 中开启和关闭正则匹配:` pattern:/...pattern.../ ` ,所以我们也应该转义它。
38+ 斜杠符号 ` '/' ` 并不是一个特殊字符 ,但是它被用于在 Javascript 中开启和关闭正则匹配:` pattern:/...pattern.../ ` ,所以我们也应该转义它。
3739
38- 下面是查询斜杠 ` '/' ` 的表达式:
40+ 下面是搜索斜杠 ` '/' ` 的表达式:
3941
4042``` js run
4143alert ( " /" .match (/ \/ / ) ); // '/'
4244```
4345
44- 从另一个方面看,如果使用另一种 ` new RegExp ` 方式就不需要转义斜杠 :
46+ 从另一个方面看,如果我们没使用 ` pattern:/.../ ` ,而是使用另一种 ` new RegExp ` 的方式创建正则表达式,则不需要转义斜杠 :
4547
4648``` js run
47- alert ( " /" .match (new RegExp (" /" )) ); // '/'
49+ alert ( " /" .match (new RegExp (" /" )) ); // 找到了 /
4850```
4951
50- ## 使用 new RegExp 创建正则实例
52+ ## new RegExp
5153
52- 如果我们使用 ` new RegExp ` 来创建一个正则表达式实例,那么我们需要对其做一些额外的转义 。
54+ 如果我们使用 ` new RegExp ` 创建正则表达式,那么我们不必转义 ` / ` ,但需要进行一些其他转义 。
5355
54- 比如说,考虑下面的示例 :
56+ 例如,考虑下面这个示例 :
5557
5658``` js run
5759let reg = new RegExp (" \d\.\d " );
5860
5961alert ( " Chapter 5.1" .match (reg) ); // null
6062```
6163
62- 它并没有正常发挥作用,但是为什么呢?
64+ 在之前的示例中我们使用 ` pattern:/\d\.\d/ ` 进行类似的搜索没问题,但 ` new RegExp("\d\.\d") ` 不起作用,为什么?
65+
66+ 因为反斜杠被字符串“消耗”了。我们可能还记得,常规字符串有自己的特殊字符,例如 ` \n ` ,反斜杠用于转义。
6367
64- 原因就在于字符串转义规则。看下面的例子 :
68+ 下面是 "\d \. \d" 的感知形式 :
6569
6670``` js run
6771alert (" \d\.\d " ); // d.d
@@ -70,18 +74,18 @@ alert("\d\.\d"); // d.d
7074在字符串中的反斜杠表示转义或者类似 ` \n ` 这种只能在字符串中使用的特殊字符。这个引用会“消费”并且解释这些字符,比如说:
7175
7276- ` \n ` —— 变成一个换行字符,
73- - ` \u1234 ` —— 变成包含该码位的 Unicode 字符,
74- - 。。。其它有些并没有特殊的含义,就像 ` \d ` 或者 ` \z ` ,碰到这种情况的话会把反斜杠移除 。
77+ - ` \u1234 ` —— 变成该编码所对应的 Unicode 字符,
78+ - ……而当没有特殊含义时:如 ` pattern: \d` 或者 ` pattern: \z` ,碰到这种情况时则会把自动移除反斜杠 。
7579
76- 所以调用 ` new RegExp ` 会获得一个没有反斜杠的字符串。
80+ 所以调用 ` new RegExp ` 会获得一个没有反斜杠的字符串。这就是搜索不起作用的原因!
7781
7882如果要修复这个问题,我们需要双斜杠,因为引用会把 ` \\ ` 变为 ` \ ` :
7983
8084``` js run
8185* ! *
8286let regStr = " \\ d\\ .\\ d" ;
8387*/ ! *
84- alert (regStr); // \d\.\d (correct now)
88+ alert (regStr); // \d\.\d(现在对了)
8589
8690let regexp = new RegExp (regStr);
8791
@@ -90,6 +94,6 @@ alert( "Chapter 5.1".match(regexp) ); // 5.1
9094
9195## Summary
9296
93- - 要在字面(意义)上搜索特殊字符 ` pattern:[ \ ^ $ . | ? * + ( ) ` ,我们需要在它们前面加上反斜杠 ` \ ` (" 转义它们" )。
94- - 如果我们在 ` pattern:/.../ ` 内部 (但不在 ` new RegExp ` 内部),还需要转义 ` / ` 。
95- - 传递一个字符串(参数)给 ` new RegExp ` 时,我们需要双倍反斜杠 ` \\ ` ,因为字符串引号会消费其中的一个 。
97+ - 要在字面意义上搜索特殊字符 ` pattern:[ \ ^ $ . | ? * + ( ) ` ,我们需要在它们前面加上一个反斜杠 ` \ ` (“ 转义它们” )。
98+ - 如果在 ` pattern:/.../ ` 内 (但不在 ` new RegExp ` 内),我们还需要转义 ` / ` 。
99+ - 当将字符串传递给给 ` new RegExp ` 时,我们需要双反斜杠 ` \\ ` ,因为字符串引号会消费一个反斜杠 。
0 commit comments