正则表达式构造函数和文字之间的反斜杠差异

时间:2015-09-24 23:12:54

标签: javascript regex constructor literals

标题总结了它。我在使用new RegExp()在正则表达式文字和构造函数之间逃避反斜杠时遇到了奇怪的差异,我很好奇它背后的内容。

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

var search = new RegExp('/(', 'g');
var result = "(test)".match(search);

但这仍然是一个错误。这个匹配在文字/\(/g;中运行良好,但在构造函数中我最终不得不做这样的事情:

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

有人可以向我解释为什么转义反斜杠需要在构造函数中转义反斜杠本身,而不是文字吗?

2 个答案:

答案 0 :(得分:3)

因为反斜杠在regexp的上下文和字符串文字的上下文中都是一个特殊字符。在regexp解析器可以看到它并应用它自己的特殊规则之前,你必须超越字符串文字的特殊用法。

答案 1 :(得分:1)

  

注意如果pattern是StringLiteral,则在RegExp处理String之前执行通常的转义序列替换。如果pattern必须包含要由RegExp识别的转义序列,则必须在StringLiteral中转义任何反斜杠\字符,以防止在形成StringLiteral的内容时删除它们。

http://www.ecma-international.org/ecma-262/5.1/#sec-15.10.4.1