Javascript 为什么正则表达式构造函数需要双转义?

Javascript 为什么正则表达式构造函数需要双转义?,javascript,regex,Javascript,Regex,在下面的正则表达式中,\s表示空格字符。我想象正则表达式解析器正在遍历字符串,看到\,知道下一个字符是特殊的 但情况并非如此,因为需要双越狱 为什么会这样 var res = new RegExp('(\\s|^)' + foo).test(moo); 是否有一个具体的例子说明单个转义如何被错误地解释为其他内容?在创建字符串的代码中,反斜杠首先是一个javascript转义字符,这意味着转义序列,如\t,\n,\“等将被转换为javascript对应项(制表符、换行符、引号等),并成为字符串的

在下面的正则表达式中,
\s
表示空格字符。我想象正则表达式解析器正在遍历字符串,看到
\
,知道下一个字符是特殊的

但情况并非如此,因为需要双越狱

为什么会这样

var res = new RegExp('(\\s|^)' + foo).test(moo);

是否有一个具体的例子说明单个转义如何被错误地解释为其他内容?

在创建字符串的代码中,反斜杠首先是一个javascript转义字符,这意味着转义序列,如
\t
\n
\“
等将被转换为javascript对应项(制表符、换行符、引号等),并成为字符串的一部分。双反斜杠表示实际字符串本身中的一个反斜杠,因此如果要在字符串中使用反斜杠,请首先转义该反斜杠


因此,当您通过说
var someString='(\\s|^)
来生成字符串时,您真正要做的是创建一个实际的字符串,其值为
(\s|^)
正则表达式需要
\s
的字符串表示形式,在JavaScript中可以使用文本
“\\s”
来生成该字符串

下面是一个实例来说明为什么
“\s”
还不够:


警报(“一个反斜杠:\s\n两个反斜杠:\\s”)您正在通过向RegExp构造函数传递字符串来构造正则表达式

\
是字符串文字中的转义字符

\
被字符串文本解析使用

const foo=“foo”;
常量字符串='(\s | ^')+foo;

console.log(字符串)\在字符串中用于转义特殊字符。如果要在字符串中使用反斜杠(例如,对于\in\s),则必须通过反斜杠将其转义。所以\变成\\


EDIT:甚至必须在这里进行编辑,因为\\在我的答案中变成\。

如前所述,在字符串文本中,反斜杠表示转义序列,而不是文本反斜杠字符,但RegExp构造函数通常需要传递给它的字符串中的文本反斜杠字符,因此,在大多数情况下,代码应该有
\\
s来表示文字反斜杠

一个问题是双重转义元字符很乏味。有一种方法可以将字符串传递给
new RegExp
,而不必双重转义:使用
string.raw
template标记,这是一种ES6功能,它允许您编写一个将由解释器逐字解析的字符串,而无需解析转义序列。例如:

console.log('\\'.length);//长度1:转义反斜杠
console.log(`\\`.length);//长度1:转义反斜杠

console.log(String.raw`\\`.length);//长度2:String.raw中不能转义请记住,不是Java或Regexp构造函数需要澄清,而是编译器(或解析器)。要补充已经正确的答案:请注意,如果您使用JavaScript编写Regexp文本,则不需要像您所怀疑的那样跳过反斜杠:
/(\s | ^)/
Related:。它既适用于常规字符串文字,也适用于模板字符串文字。