JavaScript和正则表达式:字面量语法 vs. RegExp对象

23

我对这段小的 JavaScript 代码有些困扰:

var text="Z Test Yeah ! Z";

// With literal syntax, it returns true: good!
alert(/(Z[\s\S]*?Z)/g.test(text));

// But not with the RegExp object O_o
var reg=new RegExp('Z[\s\S]*?Z','g');
alert(reg.test(text));

我不明白为什么字面量语法和RegExp对象给出的结果不同......问题在于我必须使用RegExp对象,因为我之后会有一些变量。

有什么想法吗?

先谢谢 :)

2个回答

24

您需要在字符串文字中双重转义\字符,这就是为什么正则表达式文字通常更受青睐的原因。

尝试:

'Z[\\s\\S]*?Z'

没错,加上反斜杠就可以了...!非常感谢,因为我们在使用字面量语法时不需要它们,所以我没有想到在 RegExp 对象中它们是必需的。再次感谢! - KorHosik
@zzzzBov 为什么在第二种情况下需要转义 \\ ,而在第一种情况下不需要? - Geek
5
@Geek,第一个使用的正则表达式是RegExp文字字面量。第二个使用的正则表达式是RegExp对象构造函数,其参数是字符串文字。我的答案明确指出,您需要在字符串文字中双倍转义\字符。对于字符串文字,\用于创建值的转义序列,而在正则表达式中,我们想要转义序列 成为 值。 "\n"创建一个具有换行符值的字符串,而"\\n"创建一个具有\n值的字符串。这种区别对于正则表达式模式非常重要。 - zzzzBov

3

我认为这是因为当你使用单引号时,即使使用反斜杠,你仍然需要对其进行转义。尝试这样做:

new RegExp('Z[\\s\\S]*?Z','g')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接