目前我有这样的代码..
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和回调,并且列表将变得更大。有没有更好/更清洁的方法呢?
答案 0 :(得分: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();
}
答案 1 :(得分:1)
创建一对关联数组。每对中的第一个元素是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);
}
}
答案 2 :(得分:0)
考虑:
input = "foo bar baz"
regexes = [
/aa/,
/ba./,
/quux/,
]
regexes.some(function(re) {
if(re.test(input)) {
// do stuff
return true;
}
return false;
})
请注意,除非您真正使用它返回的内容,否则您不需要match
。
答案 3 :(得分: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,如果匹配成功则返回数组(无论它有多少元素)将被铸造成真实的。
答案 4 :(得分: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 */);
}
}