1

今天偶然发现了这个小怪,有人能解释一下吗?

x = 'a \\n b';
x.replace(/\\n/g, '<br>');               // => "a <br> b"
x.replace(RegExp('\\n', 'g'), '<br>');   // => "a \\n b"
x.replace(RegExp('\\n', 'gm'), '<br>');  // => "a <br> b"

我假设/\\n/g并且RegExp('\\n', 'g')将是等效的,但事实并非如此。在什么情况下使用一种方法而不是另一种方法会产生不同的结果?

为什么需要多行标志,并且仅在使用 RegExp 对象时才需要?

编辑:第三次替换是我被斗鸡眼了,也就是说x.replace(RegExp( '\\n', 'gm'), '<br>'); // => "a \\n b"

4

2 回答 2

3

为什么需要多行标志,并且仅在使用 RegExp 对象时才需要?

这根本不需要。与正则表达式文字和构造函数一起使用时,修饰符的行为m没有区别。RegExp我看不到您的第三次替换如何为您提供该输出:

x.replace(RegExp('\\n', 'gm'), '<br>');  // => "a <br> b"

这应该"a \\n b"只给你。在字符串文字中使用反斜杠时,需要对其进行转义。同样,您需要转义字符串文字中的任何转义序列。这意味着,您需要 2 个额外的反斜杠。1 代表\n, 1 代表\之前\n

x.replace(RegExp('\\\\n', 'g'), '<br>'); 

但是,对于正则表达式文字,情况并非如此。您不需要任何额外的反斜杠。所以,现在第一和第二不应该给你同样的结果。

于 2013-09-27T04:44:36.977 回答
1

您需要使用 RegExp 构造函数进行双重转义,因为它是一个字符串,它将被转换为正则表达式。您可以对此进行测试:

console.log(RegExp('\\n')); //=> /\n/
console.log(RegExp('\\\\n')); //=> /\\n/

这适用于任何特殊字符,例如\dis \\d\bis\\b等。

于 2013-09-27T04:42:45.713 回答