改进了我对正则表达式匹配的可怕切换语句

mun*_*kee 2 javascript regex switch-statement node.js

我正试图摆脱在node.js中使用可怕的切换案例.我正在寻找一种更有效的方法来测试针对各种正则表达式案例的输入.根据匹配的情况,我要么触发事件,要么在运行另一个函数之前对输入进行一些转换.

为了节省一个非常长的代码块,我将我的功能减少到下面的骨架,因此它显示了对开关的关注.

我已经看过使用.map返回真假的可能性,但我不确定如何最好地实现它.

有关最佳方法的建议或建议吗?

function ParseLogMessages(message, config, callback){
var _this = this;

try {
//Define regex in order to match strings based on case
_this.to_group = new RegExp("^\\[\\d{2}:\\d{2}\\]\\s+\\w+\\s+tg+\\s\\>{3}");
_this.from_group=new RegExp("^\\[\\d\\d:\\d\\d\\]\\s\\w+\\s\\w+\\s\\>{3}");
_this.to_person = new RegExp("^\\[\\d{2}:\\d{2}\\]\\s[a-zA-Z0-9 \\- _]+\\s\\<{3}.+");
_this.from_person = new RegExp("^\\[\\d{2}:\\d{2}\\]\\s\\w+\\s\\>{3}");
_this.contact = new RegExp("(User #+\\d+:)");


_this.contact = new RegExp("(User #+\\d+:)");

//Test message against each to find type
switch (true){
    //Message sent to a group chat
    case _this.to_group.test(_this.payload.raw):
    break;

    //Message from a group chat
    case _this.from_group.test(_this.payload.raw):
    break;

    //Message sent to a person from the bot
    case _this.to_person.test(_this.payload.raw):
    break;

    //Message sent from a person to the bot
    case _this.from_person.test(_this.payload.raw):         
    break;

    //Contact shared
    case _this.contact.test(_this.payload.raw):     
    break;

    default:
    break;


}

callback(null,"Logfile message parsed ok!");

  } catch(err) {
    log.error(err);
    return callback(err,null);
  }

}
Run Code Online (Sandbox Code Playgroud)

Ted*_*opp 5

您可以创建一个正则表达式/函数对数组并循环遍历数组:

_this.tests = [
    { regex: new RegExp("^\\[\\d{2}:\\d{2}\\]\\s+\\w+\\s+tg+\\s\\>{3}"), // to_group
      action: ... // action for to_group
    },
    { regex : new RegExp("^\\[\\d\\d:\\d\\d\\]\\s\\w+\\s\\w+\\s\\>{3}"), // from_group
      action: ... // action for from_group
    },
    // etc.
];
Run Code Online (Sandbox Code Playgroud)

然后,您可以在测试工作时循环遍历数组,测试和中断:

for (i=0; i<tests.length; ++i) {
    if (tests[i].regex.test(_this.payload.raw) {
        tests[i].action();
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @NathanTuggy - 是的,我们有非常相似的答案.但是,使用`for..in`将导致通过正则表达式的不可预测的迭代顺序.如果测试的顺序很重要(并且我认为没有理由假设最多一个正则表达式与有效载荷数据匹配),那么应该使用数组并通过索引进行检查. (2认同)