如何在Javascript中将字符串与模式数组相匹配

How to match a string against an array of pattern in Javascript?

本文关键字:数组 模式 字符串 Javascript      更新时间:2023-09-26

我有两个变量:

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)  
   }
})

如果字符串与任何模式匹配,则可以编写自定义逻辑。

您可以遍历数组,然后使用正则表达式与单个项进行比较。