[英]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, '\\\\$&'); })
) - 逃避替代方案 .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'))
使用字边界返回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"); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.