Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查regexp匹配时如何避免多个if语句_Javascript_Node.js - Fatal编程技术网

Javascript 检查regexp匹配时如何避免多个if语句

Javascript 检查regexp匹配时如何避免多个if语句,javascript,node.js,Javascript,Node.js,目前我有这样的代码 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:

目前我有这样的代码

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个,所有这些都有不同的regexp和回调,列表会越来越大。有更好/更干净的方法吗?

您可以将正则表达式和回调重构为一个“关联数组”(对象),然后对其余的进行泛化:

var regexs = { 
    regex1: {
        regex: /./,
        callback: function () {
            // callback stuff here
        }
    },
    regex2: {
        regex: /[a-z]/,
        callback: function () {
            // callback stuff here
        }
    }
};

var result = line.match(regexs.regex1.regex);
if (result !== null) {
    return regexs.regex1.callback();
}

创建成对的关联数组。每对中的第一个元素是regexp,第二个是回调。循环数组并匹配regexp,如果存在匹配项,则调用回调

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);
    }
}
var assoc=[
{r://\d+/,f:function(m){console.log(m[1]);},
{r://\w+/,f:function(m){console.log(m[2]+m[3]);}
];
对于(变量i=0;i
考虑:

input = "foo bar baz"
regexes = [
    /aa/,
    /ba./,
    /quux/,
]

regexes.some(function(re) {
    if(re.test(input)) {
        // do stuff
        return true;
    }
    return false;
})

请注意,除非您实际使用了它返回的内容,否则不需要进行
匹配。

您可以去掉结果变量

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

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

由于match函数总是返回null或数组,因此可以安全地判断,如果匹配失败,返回的null将被强制转换为false,如果匹配成功,则返回的数组(无论它有多少个元素)将强制转换为true。

如果您的正则表达式模式是简单字符串,并且假设您希望在第二个模式之前匹配第一个模式,则可以:

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 */);
    }
}

您需要显示更多的
if
块的外观,以便我们可以知道该代码中有多少共性。我在大约5年后查看了这个问题,但仍然没有得到满意的答案,以避免通过代码进行多次存在检查。如果我没记错,没有办法将多行if语句作为依赖于正则表达式匹配的返回对象的内容。如果您有大量可能的匹配模式,您将希望尽可能优化正则表达式,方法是按字母顺序排列模式,并确保折叠多个匹配,如(aabb | aacc)类似于(aa(?:bb | cc)),但理论上正则表达式可以有大量的替代项。