首页 > 解决方案 > 需要改进正则表达式

问题描述

我写了一个简单的正则表达式来提取用户 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"]

标签: regexpcre

解决方案


交替组作为正则表达式中的第一个模式取消了一些针对以更具体模式开始的模式的优化。

由于您的替代方案与=分隔字符串匹配,因此您可以将其放在模式的开头,然后使用环视,如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=


推荐阅读