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

时间:2013-07-25 15:58:44

标签: javascript regex

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

但事实并非如此,因为需要双重转义。

为什么会这样?

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

是否有一个具体的例子说明单个逃避如何被误解为其他东西?

5 个答案:

答案 0 :(得分:31)

您正在通过将字符串传递给RegExp构造函数来构造正则表达式。

您需要转义\,以便在将其转换为正则表达式之前,您的字符串文字可以将其表示为数据。

答案 1 :(得分:15)

在您创建字符串的代码中,反斜杠首先是一个javascript转义字符,这意味着转义序列如\t\n\"等将会被翻译成他们的javascript对应物(tab,换行符,引用等),这将成为字符串的一部分。双反斜杠表示实际字符串本身中的单个反斜杠,因此如果您想在字符串中使用反斜杠,则首先将其转义。

因此,当您通过说var someString = '(\\s|^)'生成字符串时,您真正在做的是创建一个值为(\s|^)的实际字符串。

答案 2 :(得分:6)

正则表达式需要\s的字符串表示形式,在JavaScript中可以使用文字"\\s"生成。

这是一个实例,说明为什么"\s"还不够:

alert("One backslash:          \s\nDouble backslashes: \\s");

请注意\之前的额外\s如何更改输出。

答案 3 :(得分:6)

\在字符串中用于转义特殊字符。如果你想在你的字符串中使用反斜杠(例如,对于\ in \ s)你必须通过反斜杠转义它。所以\成为\\。

编辑:甚至不得不在这里做,因为\\在我的回答中转向\。

答案 4 :(得分:1)

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

一个问题是双重转义的元字符是乏味的。有一种将字符串传递到\\而不用两次转义的方法:使用new RegExp模板标签,这是ES6的功能,它允许您编写将由解释器解析的字符串< em> verbatim ,无需对转义序列进行任何解析。例如:

String.raw

因此,如果希望保持代码可读性,并且有很多反斜杠,则在模式需要反斜杠时,可以使用console.log('\\'.length); // length 1: an escaped backslash console.log(`\\`.length); // length 1: an escaped backslash console.log(String.raw`\\`.length); // length 2: no escaping in String.raw!仅键入一个反斜杠:

String.raw

但是有一个更好的选择。通常,除非您需要根据现有变量动态创建正则表达式,否则没有太多理由使用const sentence = 'foo bar baz'; const regex = new RegExp(String.raw`\bfoo\sbar\sbaz\b`); console.log(regex.test(sentence));。否则,您应该改用正则表达式文字,它们不需要对元字符进行两次转义,也不需要写出new RegExp来保持模式可读:

String.raw

最好在必须动态创建模式时才使用const sentence = 'foo bar baz'; const regex = /\bfoo\sbar\sbaz\b/; console.log(regex.test(sentence));,例如以下代码段:

new RegExp