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

时间:2015-04-06 07:05:11

标签: javascript arrays regex

我有两个变量:

var input = "user1@gmail.com";
var prefferedPatterns = ["*@gmail.com", "*@yahoo.com", "*@live.com"];

想要将输入与优先模式数组匹配。如果任何模式匹配,我将执行某项任务(在此示例中,输入是明确的匹配)。如何在javascript中匹配模式数组?

7 个答案:

答案 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)

没有正则表达式,您可以执行以下操作;

&#13;
&#13;
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;
&#13;
&#13;

答案 6 :(得分:-2)

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