[英]How to match a string against an array of pattern in Javascript?
我有两个变量:
var input = "user1@gmail.com";
var preferredPatterns = ["*@gmail.com", "*@yahoo.com", "*@live.com"];
想要将输入与首选模式数组匹配。 如果任何模式匹配,我必须执行某些任务(在此示例中,输入是确定匹配)。 如何匹配javascript中的模式数组?
您可以将您的模式(如果它们是有效的正则表达式)编译为一个以提高性能:
var masterPattern = new RegExp(patterns.join('|'));
把它们放在一起:
var input = 'user1@gmail.com';
var preferredPatterns = [
".*@gmail.com$",
".*@yahoo.com$",
".*@live.com$"
];
var masterPattern = new RegExp(preferredPatterns.join('|'));
console.log(masterPattern.test(input));
// true
在将变量作为正则表达式传递时,您需要使用RegExp
构造函数。
var input = 'user1@gmail.com';
var preferredPatterns = [".*@gmail\\.com$", ".*@yahoo\\.com$", ".*@live\\.com$"];
for (i=0; i < preferredPatterns.length;i++) {
if(input.match(RegExp(preferredPatterns[i]))) {
console.log(preferredPatterns[i])
}
}
点是正则表达式中的特殊元字符,可匹配任何字符。 您需要对正则表达式中的点进行转义以匹配文字点。
正如@zerkms 所说,您也可以使用下面的模式列表。
var preferredPatterns = ["@gmail\\.com$", "@yahoo\\.com$", "@live\\.com$"];
试试这个辅助功能:
/**
* Returns an integer representing the number of items in the patterns
* array that contain the target string text
*/
function check(str, patterns) {
return patterns.reduce(function (previous, current) {
return previous + (str.indexOf(current) == -1 ? 0 : 1);
}, 0);
}
check("user@gmail.com", ["@gmail.com", "@yahoo.com", "@live.com"]; // returns 1
check("user@live.com", ["@gmail.com", "@yahoo.com", "@live.com"]; // returns 0
如果您想要一种匹配正则表达式列表的通用方法,那么 Avinash Raj 的答案的某些版本将起作用。
基于您指定某些域的事实,您可能希望使用此处的正则表达式匹配任何有效的电子邮件地址,如果匹配,则检查该域是否是首选域。 当然,您可以通过多种不同的方式来做到这一点。 这只是一个简单的例子,在@
上拆分并使用jQuery.inArray()
检查域是否是首选的。
var preferredDomains = ["gmail.com", "yahoo.com", "live.com"];
function isValid(inputVal) {
var re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
return re.test(inputVal) && $.inArray(inputVal.split('@')[1], preferredDomains) > -1;
}
这里的优点是底层的正则表达式不会改变,只是更容易阅读/维护域列表。 您可以调整它以捕获组中的域,而不是使用 split()。
preferredPatterns.forEach(function(element, index){
if(input.match('/'+element) != null){
console.log('matching ' + element)
}
})
如果字符串匹配任何模式,您可以编写自定义逻辑。
没有正则表达式你可以做如下;
function matchPattern(xs, [y,...ys]){ function helper([x,...xs]){ return "*" + xs.join('') === y ? true : xs.length ? helper(xs) : false; } return helper(xs) ? y : ys.length ? matchPattern(xs,ys) : "No Match..!"; } var input = "user1@gmail.com", preferredPatterns = ["*@yahoo.com", "*@live.com", "*@gmail.com"]; result = matchPattern(input, preferredPatterns); console.log(result);
您可以遍历数组,然后使用正则表达式与单个项目进行比较。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.