如何在检查正则expression式匹配时避免多个if语句

目前我有这样的代码

var result = line.match( some regexp ); if (result !== null) { return callback({ a: 'aaaaa', b: bvariable }); }); } var result = line.match( some other regexp ); if (result !== null) { return callback({ d: 'ddddd', c: bvariable }); }); } 

我有大约10这些所有不同的RegExps和callback,名单将变得更大。 有没有更好的/更清洁的方式来做到这一点?

你可以摆脱结果variables

 if(line.match( some regexp )) { return callback({ a: 'aaaaa', b: bvariable }); } if(line.match( some other regexp )) { return callback({ d: 'ddddd', c: bvariable }); } 

由于匹配函数总是返回null或数组,因此如果匹配失败,则返回的null将被转换为false,如果匹配成功,返回的数组(无论有多less个元素)将被转换为真。

你可以将正则expression式和callback重构成一个“关联数组”(对象),然后概括其余部分:

 var regexs = { regex1: { regex: /./, callback: function () { // callback stuff here } }, regex2: { regex: /[az]/, callback: function () { // callback stuff here } } }; var result = line.match(regexs.regex1.regex); if (result !== null) { return regexs.regex1.callback(); } 

创build一个关联的数组对。 每对中的第一个元素是一个正则expression式,第二个是callback。 循环访问数组并匹配正则expression式,如果匹配,则调用callback函数。

 var assoc = [ { r: /\d+/, f: function (m) { console.log(m[1]); } }, { r: /\w+/, f: function (m) { console.log(m[2] + m[3]); } } ]; for (var i = 0; i < assoc.length; i++) { var m = line.match(assoc[i].r); if (m) { return assoc[i].f(m); } } 

考虑:

 input = "foo bar baz" regexes = [ /aa/, /ba./, /quux/, ] regexes.some(function(re) { if(re.test(input)) { // do stuff return true; } return false; }) 

请注意,除非您实际使用了返回的内容,否则不需要match

如果你的regex模式是简单的string,并假设你想在第二个模式之前匹配第一个模式,你可以:

 var pattern1='aaa', pattern2='bbb', RE=new RegExp('('+pattern1+'|'+pattern2+')'); // matches pattern1 OR pattern2 if(line.match(RE)){ var result=RegExp.$1; // content of first pair of capturing parens if(result===pattern1) { return callback(/* args specific to first pattern */); } else if(result===pattern2){ return callback(/* args specific to second pattern */); } else { return callback(/* args for no match */); } }