【问题标题】:Need improvement on the Regex需要改进正则表达式
【发布时间】:2020-06-04 15:38:46
【问题描述】:

我为提取用户 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"]

【问题讨论】:

  • 如果您确定它们接近每行/字符串的末尾,您可以使用.*\b(?:user="(?<user1>\w+)|admin="(?<user2>\w+))。另一个技巧:首先匹配一个空格:\s(?:user="(?<user1>\w+)|admin="(?<user2>\w+))。但是你应该记住一件事:步数并不直接意味着模式很慢。
  • 试试这个:=(?<=user=(?="(?<user1>\w+))|admin=(?="(?<user2>\w+)))
  • @B001ᛦ - 我们将这些正则表达式用于大数据目的.. 所以这些小事情会对整体性能产生很大影响(蝴蝶效应)。 :(
  • 感谢@WiktorStribiżew

标签: regex pcre


【解决方案1】:

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

由于您的替代项匹配= 分隔字符串,您可以将其放在模式的开头,然后使用环视,如Michail's suggestion。这是一个包含 139 个步骤的小变化:

=(?:(?<=user=)"(?<user1>\w+)|(?<=admin=)"(?<user2>\w+))

请参阅regex demo。详情

  • = - 一个等号
  • (?:(?&lt;=user=)"(?&lt;user1&gt;\w+)|(?&lt;=admin=)"(?&lt;user2&gt;\w+)) - 非捕获组:
    • (?&lt;=user=) - user= 必须紧靠当前位置的左侧
    • " - 一个 " 字符
    • (?&lt;user1&gt;\w+) - 组“user1”:1+ 字字符
    • | - 或
    • (?&lt;=admin=) - admin= 必须紧挨当前位置的左侧
    • " - 一个 " 字符
    • (?&lt;user2&gt;\w+) - 组“user2”:1+ 字字符

如果您的匹配总是以空格开头,请将其用作第一个模式:

\s(?:user="(?<user1>\w+)|admin="(?<user2>\w+))

参见this regex demo,有 918 个步骤。

如果您知道匹配的位置接近行尾,请使用

.*\b(?:user="(?<user1>\w+)|admin="(?<user2>\w+))

this regex demo,568 步。开头的.* 会将正则表达式索引移动到行/字符串的末尾,然后回溯以找到user=admin=

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2021-09-01
    相关资源
    最近更新 更多