javascript - 正则表达式优化和最佳实践
问题描述
我需要从旧版界面中解析出信息。我们无法更新旧消息。我对正则表达式不是很精通,但我设法写了一个做我想做的事。我只需要同行评审和反馈以确保它是干净的。
来自遗留系统的消息返回类似于以下示例的值。
%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);
}
此代码有效,我可以在名称/值的中间添加部分匹配而不会破坏任何内容。我必须假设任何字符组合都可能出现在“值”匹配中。这意味着它可以在消息中具有等号和百分号。
- 这够干净吗?
- 有什么东西可以破坏表达吗?
解决方案
首先,不要转义不需要转义的字符:%(.*)=(.*)
您的表达式的问题:值中的等号会破坏您的解析器。%name0=val=ue
将导致name0=val
=ue
而不是name0
= val=ue
。
一个可能的解决方法是通过附加问号使第一次重复变得懒惰:%(.*?)=(.*)
但是由于不需要回溯,这并不是最佳的。您可以通过使用否定字符类做得更好:%([^=]*)=(.*)
最后,如果不允许使用空名称,请将第一个星号替换为加号:%([^=]+)=(.*)
推荐阅读
- python - 在 Pandas 数据框中的列中应用 astype(str) 后,列名消失
- sml - 标准 ML 可以表达数据类型的子类型吗?
- python-3.x - Django 模型继承并避免使用多个 django.setup() 调用
- java - 在 Eclipse Marketplace 中找不到 e(fx)clipse 插件
- c# - 如何为 MongoDB 关闭 UTC 时区
- python - 有没有办法使用一个公共列合并两个数据框并从合并的数据框中只选择几个特定的行?
- lisp - Lisp - 保持单词以给定字母结尾
- kubernetes - Celery 在 Kubernetes 中找不到 Redis
- php - 如何在 Laravel 的数据库中存储视频播放进度时间
- html - 如何使输入元素完全透明?