2013-09-27 61 views
0

今天偶然发现了这个小奇怪,有人能解释一下吗?JavaScript正则表达式匹配文字\

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/gRegExp('\\n', 'g')是等价的,但是这似乎并不如此。在哪些情况下使用一种方法会产生不同的结果?

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

编辑: 3更换为我是斗鸡眼,这是x.replace(RegExp('\\n', 'gm'), '<br>'); // => "a \\n b"

回答

2

为什么多标志必要的,只有:你可以测试这个?

这根本不需要。与正则表达式和RegExp构造函数一起使用时,m修饰符的行为不会有所不同。我不明白你怎么第三届更换,给你的输出:

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

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

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

但是,用正则表达式,它不是这样的。你不需要任何额外的反斜杠。所以,现在第一和第二不应该给你同样的结果。

+0

你是对的,那个替换没有给我那个输出。我显然只是无法读取控制台。完全忘记了双重逃跑,知道这是简单的事情。谢谢! – kalhartt

+0

@kalhartt。别客气 :) –

1

您需要双击逃生用RegExp的构造函数,因为它是一个字符串,将被转换为正则表达式。使用RegExp对象时

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

这适用于任何特殊字符,所以\d\\d\b\\b