为什么正则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");