javascript - 改进我可怕的 switch 正则表达式匹配语句

标签 javascript regex node.js switch-statement

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

为了节省非常长的代码块,我将我的函数缩减为下面的框架,以便它显示对开关的关注。

我已经了解了使用 .map 返回 true false 的可能性,但我也不确定如何最好地实现它。

关于执行此操作的最佳方法有什么意见或建议吗?

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

}

最佳答案

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

_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.
];

然后就可以循环遍历数组,测试,测试成功了就断:

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

关于javascript - 改进我可怕的 switch 正则表达式匹配语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27917523/

相关文章:

python - 非关键字标识符的正则表达式

javascript - 类型错误 : Object function EventEmitter()

javascript - 将 JqGrid 列模式显示为日期和超链接显示 NAN/NAN/NAN

c - IPv6 地址的正则表达式

php - 正则表达式练习 : reluctant quantifier with a lookahead assertion

javascript - 编译 Typescript 而不丢失 node_modules 路径?

node.js - 运行shell命令并在http服务器中显示

javascript - 使用 PHP ajax 调用后执行 Chartjs

JavaScript、正则表达式 - `.replace` 仅删除最后匹配的部分(当多个匹配时)

javascript - 如何使用 jquery-ui-map 重新居中 map