Javascript 正则表达式优化和最佳实践

Javascript 正则表达式优化和最佳实践,javascript,regex,regex-lookarounds,regex-group,regex-greedy,Javascript,Regex,Regex Lookarounds,Regex Group,Regex Greedy,我需要从遗留接口解析信息。我们无法更新旧邮件。我对正则表达式不是很精通,但我成功地编写了一个符合我要求的正则表达式。我只需要同行评议和反馈,以确保它是干净的 来自遗留系统的消息返回类似以下示例的值 %name0=value %name1=value %name2=value 这段代码可以工作,我可以在名称/值的中间添加部分匹配,而不会出现任何中断。我必须假设任何字符的组合都可能出现在值匹配中。这意味着消息中可能有等号和百分号 这够干净吗? 有什么东西可以打破这个表达吗? 您的表达式很好,用两个

我需要从遗留接口解析信息。我们无法更新旧邮件。我对正则表达式不是很精通,但我成功地编写了一个符合我要求的正则表达式。我只需要同行评议和反馈,以确保它是干净的

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

%name0=value
%name1=value
%name2=value
这段代码可以工作,我可以在名称/值的中间添加部分匹配,而不会出现任何中断。我必须假设任何字符的组合都可能出现在值匹配中。这意味着消息中可能有等号和百分号

这够干净吗? 有什么东西可以打破这个表达吗?
您的表达式很好,用两个捕获组包装它很容易获得所需的变量和值

你可能不需要逃避一些咒语,它仍然可以工作

如果愿意,您可以使用和测试/编辑/修改/更改表达式:

%(.+)=(.+)
因为您的数据是非常结构化的,所以您也可以使用stringsplit这样做,并获得相同的所需输出(如果需要)

正则描述图 此图显示了表达式的工作方式,您可以通过以下方式可视化其他表达式:

JavaScript测试 常量正则表达式=/%.+=.+/gm; 常量str=`%name0=value %名称1=值 %名称2=值`; 让m; 而m=regex.execstr!==空的{ //这是避免具有零宽度匹配的无限循环所必需的 如果m.index==regex.lastIndex{ regex.lastIndex++; } //可以通过'm`-变量访问结果。 m、 forEachmatch,groupIndex=>{ log`find match,group${groupIndex}:${match}`; };
} 您的表达式很好,用两个捕获组包装它很容易获得所需的变量和值

你可能不需要逃避一些咒语,它仍然可以工作

如果愿意,您可以使用和测试/编辑/修改/更改表达式:

%(.+)=(.+)
因为您的数据是非常结构化的,所以您也可以使用stringsplit这样做,并获得相同的所需输出(如果需要)

正则描述图 此图显示了表达式的工作方式,您可以通过以下方式可视化其他表达式:

JavaScript测试 常量正则表达式=/%.+=.+/gm; 常量str=`%name0=value %名称1=值 %名称2=值`; 让m; 而m=regex.execstr!==空的{ //这是避免具有零宽度匹配的无限循环所必需的 如果m.index==regex.lastIndex{ regex.lastIndex++; } //可以通过'm`-变量访问结果。 m、 forEachmatch,groupIndex=>{ log`find match,group${groupIndex}:${match}`; };
} 首先,不要转义不需要转义的字符:%.*=*

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

一种可能的修复方法是通过添加问号来延迟第一次重复:%.*?=*

但由于不必要的回溯,这不是最优的。使用否定字符类可以做得更好:%[^=]*=*

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


这是一个很好的资源:

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

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

一种可能的修复方法是通过添加问号来延迟第一次重复:%.*?=*

但由于不必要的回溯,这不是最优的。使用否定字符类可以做得更好:%[^=]*=*

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


这是一个很好的资源:

如果你的代码工作正常,没有问题,请考虑发布问题。如果你的代码工作正常,没有问题,请考虑发布问题。感谢您的反馈和链接到测试工具。谢谢您的反馈和链接到测试工具。谢谢您的反馈和教程。谢谢您的反馈和教程。
%(.+)=(.+)