我有两个变量:
var input = "user1@gmail.com";
var prefferedPatterns = ["*@gmail.com", "*@yahoo.com", "*@live.com"];
想要将输入与优先模式数组匹配。如果任何模式匹配,我将执行某项任务(在此示例中,输入是明确的匹配)。如何在javascript中匹配模式数组?
答案 0 :(得分:3)
在将变量作为正则表达式传递时,您需要使用RegExp
构造函数。
var input = 'user1@gmail.com';
var prefferedPatterns = [".*@gmail\\.com$", ".*@yahoo\\.com$", ".*@live\\.com$"];
for (i=0; i<prefferedPatterns.length;i++) {
if(input.match(RegExp(prefferedPatterns[i]))) {
console.log(prefferedPatterns[i])
}
}
Dot是正则表达式中的一个特殊元字符,可以匹配任何字符。您需要在正则表达式中转义点以匹配文字点。
正如@zerkms所说,你也可以使用下面的模式列表。
var prefferedPatterns = ["@gmail\\.com$", "@yahoo\\.com$", "@live\\.com$"];
答案 1 :(得分:3)
您可以将模式(如果它们是有效的正则表达式)编译为一个以提高性能:
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
答案 2 :(得分:1)
如果你想要一个通用的方法来匹配正则表达式列表,那么某些版本的Avinash Raj的答案将会起作用。
根据您指定某些域的事实,您可能希望匹配any valid email address using the regex here,如果匹配,则检查域是否是首选域。当然,有很多种方法可以做到。这只是一个简单的示例,在@
上拆分并使用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()。
答案 3 :(得分:0)
试试这个辅助功能:
/**
* 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
答案 4 :(得分:0)
prefferedPatterns.forEach(function(element, index){
if(input.match('/'+element) != null){
console.log('matching ' + element)
}
})
如果字符串与任何模式匹配,您可以编写自定义逻辑。
答案 5 :(得分:0)
没有正则表达式,您可以执行以下操作;
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",
prefferedPatterns = ["*@yahoo.com", "*@live.com", "*@gmail.com"];
result = matchPattern(input,prefferedPatterns);
console.log(result);
&#13;
答案 6 :(得分:-2)
您可以遍历数组,然后使用正则表达式与单个项目进行比较。