原文链接:https://javascript.info/regexp-escaping,translate with ❤️ by zhangbao.
我们已经看到,反斜杠”\
“用来表示字符类,所以它是个特殊字符。
还有其他的一些特殊字符,在正则表达式中它们有特殊的含义。它们用来进行更加强大的查找任务。
这里列举了完整的名单:[ \ ^ $ . | ? * + ( )
。
不要试图去记住他们——当我们对它们中的每个单独讲解后,你就会在心里自动记住它们。
转义
将一个特殊字符当作常规字符对待,要在它们之前加上反斜杠。
这称之为”转义字符”。
例如,我们需要查找一个点”.
“。在常规的正则表达式里,点表示”除了换行符之外的任意一个字符”,如果想要真正去找”一个点”,就需要在前面放上一个反斜杠:\.
。
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(现在是正确的了)
let reg = new RegExp(regStr);
alert( 'Chapter 5.1'.match(reg) ); // ["5.1"]
(完)