【问题标题】:Javascript: String.match() - pass string variable in regular expression [duplicate]Javascript:String.match() - 在正则表达式中传递字符串变量[重复]
【发布时间】: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);
}

我尝试的方法不起作用。

【问题讨论】:

    标签: javascript string


    【解决方案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 以后
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-10-24
          • 1970-01-01
          • 2011-03-09
          • 2010-10-04
          • 1970-01-01
          • 1970-01-01
          • 2012-10-05
          相关资源
          最近更新 更多