为什么正则expression式的构造函数需要双重逃脱?
在下面的正则expression式中, \s
表示空格字符。 我想象正则expression式parsing器,正在通过string,并看到\
并知道下一个字符是特殊的。
但事实并非如此,因为需要双重转义。
为什么是这样?
var res = new RegExp('(\\s|^)' + foo).test(moo);
有没有一个具体的例子,说明一个逃生可能被误解为别的东西?
您正在通过将string传递给RegExp构造函数来构造正则expression式。
您需要转义\
以便您的string文字可以expression它为数据,然后将其转换为正则expression式。
在你创build一个string的代码里面,反斜杠首先是一个javascript转义字符,这意味着像\t
, \n
, \"
等转义序列将会被翻译成它们的javascript对应部分(tab,newline,quote等等),并且这些将成为string的一部分。双反斜线表示实际string本身中的单个反斜杠,所以如果您想在string中使用反斜线,则首先将其转义。
所以当你通过说var someString = '(\\s|^)'
产生一个string时,你真正在做的是用值(\s|^)
创build一个实际的string。
\用于string来转义特殊字符。 如果你想在你的string中加一个反斜杠(例如\ in \ s),你必须通过一个反斜杠来转义它。 所以\成为\\。
编辑:甚至不得不在这里做,因为\ \在我的答案转向\。
正则expression式需要\s
的string表示,在JavaScript中可以使用字符"\\s"
来产生。
下面是一个实例来说明为什么"\s"
是不够的:
alert("One backslash: \s\nDouble backslashes: \\s");