Javascript:String.match() - 在正则表达式中传递字符串变量[重复]

Posted

技术标签:

【中文标题】Javascript:String.match() - 在正则表达式中传递字符串变量[重复]【英文标题】:Javascript: String.match() - pass string variable in regular expression [duplicate] 【发布时间】:2015-09-11 15:05:07 【问题描述】:

我尝试重写方法(w3schools 上tutorial 的一部分)。

问题是让一个变量字符串成为正则表达式的一部分。

教程示例代码:

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);

我尝试的方法不起作用。

【问题讨论】:

【参考方案1】:

使用正则构造函数,如:

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);

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

是的 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);

【讨论】:

【参考方案4】:

您可以搜索“动态正则表达式”并找到: javascript Regexp dynamic generation from variables? 或Use dynamic (variable) string as regex pattern in JavaScript 都很好地描述了它。

【讨论】:

这真的应该是评论,而不是答案。或者也许这个问题应该被标记为链接答案之一的重复? 我不知道如何做到这一点。如果你告诉我,我会为我看到的下一个副本这样做。但大多数时候,当我看到其他重复项时,人们会回答“答案”,因为这是问题的答案。 @eX0du5 你可能已经看到了,但它不是这样工作的 :) 如果你有足够的代表,你可以看到一个“关闭”选项。如果您不这样做,请发表评论,说明它是重复的,并且有足够代表的人会投票为您关闭【参考方案5】:

请注意,您将字符串传递给match。如果我们关注documentation,这将执行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 @RGraham 这就是我将"gi" 传递给str.match 的原因。如果我们不通过它,结果只是 Array [ "ain" ] :没有全局搜索和不区分大小写的搜索。所以我会说默认情况下不会将任何内容传递给RegExp 构造函数。 String.prototype.match 没有重载,它接受 2 个参数。至少在规范和 Chrome 实现中。您的代码在 Chrome 42 上生成 Array [ "ain" ] 好点。我在 FF 31 中进行了测试,并且存在过载,结果是我提供的。我会更新我的答案。 是的,MDN 上的Firefox-specific notes 中提到了这一点,但警告只出现在 FF39 以后

以上是关于Javascript:String.match() - 在正则表达式中传递字符串变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

String.match(正则 或 'string') 有两种方式

LeetCode Repeated String Match

686. Repeated String Match

686. Repeated String Match

686. Repeated String Match

#Leetcode# 942. DI String Match