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') 有两种方式