如何在Javascript中将字符串与模式数组相匹配
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的某些版本的答案将起作用。
基于指定特定域的事实,您可能希望在此处使用regex匹配任何有效的电子邮件地址,如果匹配,则检查该域是否为首选域。当然,有很多不同的方法可以做到这一点。这里只是一个简单的例子,在@
上进行拆分,并使用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;
}
这里的优点是底层regex不会改变,只是更容易读取/维护域列表。您可以调整它来捕获组中的域,而不是使用split()。
没有regexp,您可以执行以下操作;
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);
preferredPatterns.forEach(function(element, index){
if(input.match('/'+element) != null){
console.log('matching ' + element)
}
})
如果字符串与任何模式匹配,则可以编写自定义逻辑。
您可以遍历数组,然后使用正则表达式与单个项进行比较。
相关文章:
- 如何在Javascript中将字符串与模式数组相匹配
- 使用mongoose将数据推送到mongoDB模式中的数组中
- Mongoose模式:强制创建一个对象数组
- 使用Javascript的数组模式
- 谷歌跟踪代码管理器使用什么模式来观察 de 'dataLayer' 数组
- 如何在不创建数组的情况下使用NgFor来生成矩阵UI模式
- 如何通过向用户推送模式引用来更新用户对象's数组字段
- 如何将javascript数组更改为角度模式形式的JSON对象
- 如何使用lodash返回与模式匹配的属性数组
- 如何在不选择模式配置参数的情况下,使用mongoose在MongoDB模式实例化中的关联数组/对象中执行foreach
- 在数据集中使用递归搜索 2D 数组模式
- 在数组 jQuery 中查找特定的字符串模式
- Javascript:数组反模式
- 删除数组递归调用模式中的项
- 数组数组的“列总计”模式
- 单个模式数组中的多个模式引用 - 猫鼬
- 如何从IE和Chrome浏览器中的显示模式对话框窗口返回数组对象
- 在 Javascript 中获取统计模式,而无需使用关联数组
- 在JavaScript中全局替换数组模式中的字符串
- 验证json数组模式