首页 > 解决方案 > 正则表达式优化和最佳实践

问题描述

我需要从旧版界面中解析出信息。我们无法更新旧消息。我对正则表达式不是很精通,但我设法写了一个做我想做的事。我只需要同行评审和反馈以确保它是干净的。

来自遗留系统的消息返回类似于以下示例的值。

%name0=value
%name1=value
%name2=value
Expression: /\%(.*)\=(.*)/g;
var strBody = body_text.toString();
var myRegexp = /\%(.*)\=(.*)/g;
var match = myRegexp.exec(strBody);
var objPair = {};

while (match != null) {
    if (match[1]) {
        objPair[match[1].toLowerCase()] = match[2];
    }
    match = myRegexp.exec(strBody);
}

此代码有效,我可以在名称/值的中间添加部分匹配而不会破坏任何内容。我必须假设任何字符组合都可能出现在“值”匹配中。这意味着它可以在消息中具有等号和百分号。

标签: javascriptregexregex-lookaroundsregex-groupregex-greedy

解决方案


首先,不要转义不需要转义的字符:%(.*)=(.*)

您的表达式的问题:值中的等号会破坏您的解析器。%name0=val=ue将导致name0=val=ue而不是name0= val=ue

一个可能的解决方法是通过附加问号使第一次重复变得懒惰:%(.*?)=(.*)

但是由于不需要回溯,这并不是最佳的。您可以通过使用否定字符类做得更好:%([^=]*)=(.*)

最后,如果不允许使用空名称,请将第一个星号替换为加号:%([^=]+)=(.*)

这是一个很好的资源:Regex Tutorial - Repetition with Star and Plus


推荐阅读