JavaScript: String.match() - 在正则表达式中传递字符串变量

12

我试图重写这个方法(来自于w3schools的教程的一部分)。

问题是将一个可变的字符串变成正则表达式的一部分。

教程示例代码:

function myFunction() {
    var str = "The rain in SPAIN stays mainly in the plain"; 
    var res = str.match(/ain/gi);
    console.log(res)
}

我尝试了:

function myFunction() {
    var str = "The rain in SPAIN stays mainly in the plain"; 
    var test = "ain";
    var re = "/"+test+"/gi";
    var res = str.match(re);
    console.log(res);
}

我尝试的方法没有奏效。

5个回答

16

使用正则表达式构造器,例如:

function myFunction() {
    var str = "The rain in SPAIN stays mainly in the plain",
        test = "ain",
        re = new RegExp(test, 'gi'),
        res = str.match(re);

    console.log(res);
}

7

如果你想将变量的值作为正则表达式传递,你需要使用 RegExp 构造函数。

var test = "ain";
var re = new RegExp(test, "gi");

如果您的变量包含特殊字符,最好对其进行转义。

var re = new RegExp(test.replace(/(\W)/g, "\\$1"), "gi");

6
请注意,您需要向match传递一个字符串。如果我们遵循文档,这将执行一个new RegExp(test)。因此,您应该避免使用//gi字符串,并将相应的标志添加到RegExp构造函数中:默认构造函数既不添加全局搜索(g)也不添加大小写敏感搜索(i)。
因此,您问题的解决方案是:
var str = "The rain in SPAIN stays mainly in the plain"; 
var test = "ain";
var res = str.match(new RegExp(test, "gi"));

这将返回:
Array [ "ain", "AIN", "ain", "ain" ]

注意: str.match(test, "gi");表单仅适用于Firefox浏览器,但在Firefox 39中已被弃用并会抛出控制台警告(请参见RGraham评论)。

根据链接的文档,这不会将“gi”标志传递给RegExp构造函数。它默认传递“g”,但不传递“i”。 - CodingIntrigue
这就是我将“gi”传递给str.match的原因。如果我们不传递它,结果只是Array [ "ain" ]:没有全局搜索和不区分大小写搜索。因此,我认为默认情况下没有向RegExp构造函数传递任何内容。 - TrapII
1
String.prototype.match没有接受两个参数的重载。至少在规范和Chrome实现中是如此。你的代码在Chrome 42上的结果是Array [ "ain" ] - CodingIntrigue
好的,我在Firefox 31中进行了测试,重载存在,并且结果与我提供的一致。我会更新我的答案。 - TrapII
是的,在MDN的Firefox特定说明中提到了这一点,但只有在FF39及更高版本上才会出现警告。 - CodingIntrigue

5

是的,match()不能与字符串字面量一起使用。

您可以使用var re = new RegExp(test,"gi");

 var str = "The rain in SPAIN stays mainly in the plain"; 
    var test = "ain";
    var re = new RegExp(test,"gi");
    var res = str.match(re);
    console.log(res);

5

3
这应该是一条评论,而不是答案。或者也许这个问题应该被标记为其中一个链接回答的重复? - RobG
我不知道这该怎么做。如果你告诉我,我会在下次看到重复的时候这样做。但是大多数情况下,当我看到其他重复问题时,人们都回答说“答案”,因为那就是解决问题的答案。 - eX0du5
@eX0du5 你可能已经看到了,但那不是它的工作原理 :) 如果你有足够的声望,你可以看到一个“关闭”选项。如果你没有,留下一条评论解释这是一个重复的问题,并且有足够声望的人会为你投票关闭。 - CodingIntrigue

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