1

目前我有这样的代码..

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 个这些都具有不同的正则表达式和回调,并且列表会变得更大。有没有更好/更清洁的方法来做到这一点?

4

5 回答 5

1

您可以将正则表达式和回调重构为“关联数组”(对象),然后概括其余部分:

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();
}
于 2012-09-21T13:04:26.563 回答
1

创建一个关联数组对。每对中的第一个元素是一个正则表达式,第二个是回调。遍历数组并匹配正则表达式,如果有匹配则调用回调。

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);
    }
}
于 2012-09-21T13:05:08.137 回答
0

考虑:

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

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

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

于 2012-09-21T13:25:27.447 回答
0

您可以摆脱结果变量

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,如果匹配成功,则返回的数组(无论它有多少元素)都将被强制转换为真。

于 2012-09-21T13:33:55.023 回答
0

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

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 */);
    }
}
于 2012-09-22T04:42:38.873 回答