Javascript 正则表达式构造函数和文本之间存在反斜杠差异

Javascript 正则表达式构造函数和文本之间存在反斜杠差异,javascript,regex,constructor,literals,Javascript,Regex,Constructor,Literals,标题概括了这一点。我在正则表达式文本和带有new RegExp()的构造函数之间的反斜杠转义中遇到了一个奇怪的差异,我很好奇它背后的原因 我试图在构造函数中转义括号(),如下所示: var search = new RegExp('/(', 'g'); var result = "(test)".match(search); 但这会不断返回错误。匹配在literal/\(/g;)中运行良好,但在构造函数中,我不得不执行以下操作: search = new RegExp('\\(', 'g');

标题概括了这一点。我在正则表达式文本和带有
new RegExp()
的构造函数之间的反斜杠转义中遇到了一个奇怪的差异,我很好奇它背后的原因

我试图在构造函数中转义括号
),如下所示:

var search = new RegExp('/(', 'g');
var result = "(test)".match(search);
但这会不断返回错误。匹配在literal
/\(/g;
)中运行良好,但在构造函数中,我不得不执行以下操作:

search = new RegExp('\\(', 'g');

有人能给我解释一下为什么转义反斜杠在构造函数中需要转义反斜杠本身,而不是一个文本吗?

因为反斜杠在regexp上下文和字符串文本上下文中都是一个特殊字符。在regexp解析器看到t并应用它自己的特殊规则。

因为反斜杠在regexp的上下文和字符串文本的上下文中都是一个特殊字符。在regexp解析器能够看到它并应用它自己的特殊规则之前,您必须通过字符串文本的特殊用法

注意:如果模式是StringLiteral,通常的转义序列替换将在RegExp处理字符串之前执行。如果模式必须包含要由RegExp识别的转义序列,则必须在StringLiteral中转义任何反斜杠\字符,以防在StringLiteral的内容为武装起来

注意:如果模式是StringLiteral,通常的转义序列替换将在RegExp处理字符串之前执行。如果模式必须包含要由RegExp识别的转义序列,则必须在StringLiteral中转义任何反斜杠\字符,以防在StringLiteral的内容为武装起来


谢谢,保罗!这确实有道理。谢谢,保罗!这确实有道理。