为什么由 /.../ 创建的 JavaScript RegExp 能够工作,但通过 "new RegExp" 创建的相同正则表达式却无法工作?

3

我不确定这里的区别是什么,也不知道为什么一个有效而另一个无效。有人可以解释一下吗?

//The string to search through
var str = "This is a string /* with some //stuff in here";

//This one will NOT work, it alerts an empty "match"
var regEx = new RegExp( "(\/\*)", "g" );

//This one also will NOT work (tried just in case escaping was the issue)
var regEx2 = new RegExp( "(/*)", "g" );

//This one DOES work
var regEx3 = /(\/\*)/g;

var match = null;

//Trying the first one, it alerts ","
if ( match = regEx.exec( str ) ) alert( match );

//Trying the second one, it alerts ","
if ( match = regEx2.exec( str ) ) alert( match );

//Trying the third one, it alerts "/*,/*" - it works!
if ( match = regEx3.exec( str ) ) alert( match );

我做错了什么?
3个回答

6

\是字符串中的转义字符。因此,为了在正则表达式中创建一个字面意义上的反斜杠作为转义字符,你需要对其进行转义:

var regEx = new RegExp("(/\\*)", "g" );

如果您使用Chrome或Safari(可能还包括Firebug),您可以通过在控制台中执行代码轻松查看结果表达式: > new RegExp( "(/\*)", "g" ); /(/*)/g > new RegExp( "(/\\*)", "g" ); /(/\*)/g
P.S.:无需在字符串中转义斜杠(尽管在正则表达式中可能会被忽略)。

是的!谢谢,那就是问题所在!我忘记转义转义字符了。 :) - Don Rhummy
顺便提一下,为了完整回答你的问题,你应该注意到这两种语法产生的对象完全相同,即使它不是问题的主要内容。 - Casimir et Hippolyte

1
为了得到与/(\/\*)/g等效的结果,您需要使用new RegExp("(\\/\\*)", "g")

0

这是因为你在 RegExp 对象中转义了不需要转义的正斜杠。你还需要转义反斜杠。

等价于:/(\/\*)/g

是:var regEx = new RegExp( "(/\\*)", "g" );


在字符串版本中转义正斜杠并不会造成任何伤害,只是没有必要。 - Alan Moore

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