正如我们所看到的,一个反斜杠
"\"
是用来表示匹配字符类的。所以它是一个特殊字符。
还存在其它的特殊字符,这些字符在正则表达式中有特殊的含义。它们可以被用来做更加强大的搜索。
这里是包含所有特殊字符的列表:
[ \ ^ $ . | ? * + ( )
。
现在并不需要尝试去记住它们 —— 当我们分别处理其中的每一个时,你自然而然就会记住它们。
转义
如果要把特殊字符作为常规字符来使用,只需要在它前面加个反斜杠。
这种方式也被叫做“转义一个字符”。
比如说,我们需要找到一个点号
'.'
。在一个正则表达式中一个点号意味着“除了换行符以外的任意字符”,所以如果我们想真正表示对“一个点号”查询的时候,可以在点号前加一个反斜杠。
| 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 2 3 | let reg = new RegExp("\d\.\d"); alert( "Chapter 5.1".match(reg) ); // null |
它并没有正常发挥作用,但是为什么呢?
原因就在于字符串转义规则。看下面的例子:
| 1 | alert("\d\.\d"); // d.d |
在字符串中的反斜杠表示转义或者类似
\n
这种只能在字符串中使用的特殊字符。这个引用会“消费”并且解释这些字符,比如说:
-
\n—— 变成一个换行字符, -
\u1234—— 变成包含该码位的 Unicode 字符, - 。。。其它有些并没有特殊的含义,就像
\d或者\z,碰到这种情况的话会把反斜杠移除。
所以调用
new RegExp
会获得一个没有反斜杠的字符串。
如果要修复这个问题,我们需要双斜杠,因为引用会把
\\
变为
\
:
| 1 2 3 4 5 6 | <em>let regStr = "\\d\\.\\d";</em> alert(regStr); // \d\.\d (correct now) let regexp = new RegExp(regStr); alert( "Chapter 5.1".match(regexp) ); // 5.1 |
Summary
- 要在字面(意义)上搜索特殊字符
[ \ ^ $ . | ? * + ( ),我们需要在它们前面加上反斜杠\(“转义它们”)。 - 如果我们在
/.../内部(但不在new RegExp内部),还需要转义/。 - 传递一个字符串(参数)给
new RegExp时,我们需要双倍反斜杠\\,因为字符串引号会消费其中的一个 - via
原文连接
的情况下转载,若非则不得使用我方内容。