regex - 需要改进正则表达式
问题描述
我写了一个简单的正则表达式来提取用户 SC08。
https://regex101.com/r/L1DOzH/1/性能方面,大约 1448 步真的很糟糕。
Jun 2 11:16:44 192.168.55.19 1 2020-06-02T10:16:43.721Z chisdsm@abcd.com dsm 4493 USR1278I [U@21513 sev="INFO" msg="user logged out due to inactivity" user="SC08"]
Jun 2 10:13:50 192.168.55.19 1 2020-06-02T09:13:50.297Z chisdsm@abcd.com dsm 4493 DO0426I [DA@21513 sev="INFO" msg="switch domain" admin="SC08"
Jun 2 10:13:43 192.168.55.19 1 2020-06-02T09:13:42.956Z chisdsm@abcd.com dsm 4493 DAO0267I [DA@21513 sev="INFO" msg="user logged in" admin="SC08" stime="2020-06-02 10:13:42.944" role="ALL_ADMIN" source="192.168.54.9"]
May 27 15:53:38 192.168.55.129 1 2020-05-27T14:53:37.669Z chisdsm@abcd.com dsm 4493 DAO0227I [DA@21513 sev="INFO" msg="delete file signature" user="SC08" filePath="/bin/rm"]
解决方案
交替组作为正则表达式中的第一个模式取消了一些针对以更具体模式开始的模式的优化。
由于您的替代方案与=
分隔字符串匹配,因此您可以将其放在模式的开头,然后使用环视,如Michail 的建议中所示。这是一个有 139 个步骤的小变化:
=(?:(?<=user=)"(?<user1>\w+)|(?<=admin=)"(?<user2>\w+))
请参阅正则表达式演示。细节
=
- 一个等号(?:(?<=user=)"(?<user1>\w+)|(?<=admin=)"(?<user2>\w+))
- 非捕获组:(?<=user=)
-user=
必须紧挨当前位置的左侧"
- 一个"
字符(?<user1>\w+)
- 组“user1”:1+ 字字符|
- 或者(?<=admin=)
-admin=
必须紧挨当前位置的左侧"
- 一个"
字符(?<user2>\w+)
- 组“user2”:1+ 字字符
如果您的匹配项总是以空格开头,请将其用作第一个模式:
\s(?:user="(?<user1>\w+)|admin="(?<user2>\w+))
请参阅此正则表达式演示,包含 918 个步骤。
如果您知道匹配项位于行尾附近,请使用
.*\b(?:user="(?<user1>\w+)|admin="(?<user2>\w+))
请参阅此正则表达式演示,568 步。.*
在开始时会将正则表达式索引移动到行/字符串的末尾,然后回溯以查找user=
or admin=
。
推荐阅读
- c++ - 如何从 C++ 中的朋友类访问私有静态方法
- angularjs - 传递参数:到 Web API 适用于 $http.get 但不适用于 $http.Post
- android - 如何在android中的处理程序内停止处理程序
- numpy - TensorFlow 高级估计器的预处理数据集
- vb.net - 使用 Linq 更改数据表中的单元格值
- c# - 属性路由不是现有路由
- php - 分页架构
- swift4 - Bundle.main.bundleIdentifier 返回 nil
- docker - kubectl delete/create secret 禁止(谷歌云平台)
- python - 从 API 中检索允许访问的私有谷歌表格的内容?