正则表达式将所有动态字符串单词匹配到数据属性

Regex Match ALL Dynamic string words to data attribute

是否可以动态生成字符串

var string= "a,b,c";

并从中制作一个正则表达式,接受任何字符串单词作为接受的匹配项?

regExApproved = new RegExp(string, 'ig');

这样我们就可以搜索元素的数据属性并显示它是否在属性中有任何可接受的匹配项

$(this).attr("data-payment").match(regExApproved)

我面临的问题是正则表达式采用整个字符串并使其成为唯一的匹配案例。
我需要正则表达式来分解字符串并接受其中的任何单词作为匹配

这可能吗? 我不想使用 forloop 并为字符串中的每个单词制作很多不同的正则表达式匹配,但也许我必须这样做?

我建议使用

var regExApproved = new RegExp(string.split(",").map(x => x.replace(/[-\/\^$*+?.()|[\]{}]/g, '\$&')).join('|'), 'i');

然后,要检查正则表达式是否匹配字符串,使用 RegExp#test 方法更有意义:

regExApproved.test($(this).attr("data-payment"))

备注:

  • .split(",") - 分成逗号分隔的块
  • .map(x => x.replace(/[-\/\^$*+?.()|[\]{}]/g, '\$&'))(或.map(function(x) return x.replace(/[-\/\^$*+?.()|[\]{}]/g, '\$&'); }))-escapes备选方案
  • .join('|') 创建最终交替模式。

编辑

您的 string 似乎是一个值数组。在这种情况下,使用

var string= ['visa','mastercard'];
var regExApproved = new RegExp(string.join('|'), 'i');
// If the items must be matched as whole words:
// var regExApproved = new RegExp('\b(?:' + string.join('|') + ')\b', 'i');
// If the array items contain special chars:
// var regExApproved = new RegExp(string.map(x => x.replace(/[-\/\^$*+?.()|[\]{}]/g, '\$&')).join('|'), 'i');
console.log(regExApproved.test("There is MasterCard here"));

如果你的 string 是逗号分隔的单词列表,你可以用逗号分隔它,然后使用 Array 方法的组合来检查是否有任何 word 在里面匹配测试字符串。

你的代码应该是这样的:

string.split(",").map(s => new RegExp('\b' + s + '\b')).some(r => $(this).attr("data-payment").match(r))

我们有:

  • string.split(",") 用逗号分隔 string
  • .map(s => new RegExp('\b' + s + '\b')) 到 return string 中每个单词的相关 regex 使用单词边界。
  • .some(r => $(this).attr("data-payment").match(r)) 检查我们的 string 是否匹配任何一个创建的正则表达式。

演示:

var string = "is,dog,car";

let str = "this is just a test";

if (string.split(",").map(s => new RegExp('\b' + s + '\b')).some(r => str.match(r))) {
  console.log("Matched");
}