需要改进Regex

问题描述 投票:1回答:1

我写了一个简单的提取用户SC08的regex。

https:/regex101.comrL1DOzH1 性能方面,它真的很差,需要1448步。

Jun  2 11:16:44 192.168.55.19 1 2020-06-02T10:16:43.721Z [email protected] 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 [email protected] 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 [email protected] 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 [email protected] dsm 4493 DAO0227I [DA@21513 sev="INFO" msg="delete file signature" user="SC08" filePath="/bin/rm"]
regex pcre
1个回答
1
投票

替换组作为regex中的第一个模式,会取消一些针对以更特定模式开始的模式的优化。

由于您的替代组匹配 = 分隔的字符串,你可以把它放在模式的开头,然后使用lookaround,如在 米哈伊尔的建议. 这里是一个小的变化,有139个步骤。

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

请看 搜索引擎演示. 详情

  • = - 等号
  • (?:(?<=user=)"(?<user1>\w+)|(?<=admin=)"(?<user2>\w+)) - 一个非抓捕组。
    • (?<=user=) - user= 必须在当前位置的左边
    • " - a " 烧焦
    • (?<user1>\w+) - 组 "用户1"。1+单词字符
    • | - 或
    • (?<=admin=) - admin= 必须在当前位置的左边
    • " - a " 烧焦
    • (?<user2>\w+) - 组 "用户2"。1+单词字符

如果你的匹配项前面总是有一个空格,那么就用它作为第一个模式。

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

参见 这个regex演示,共918步。

如果你知道火柴在某处接近终点,就用

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

请看 这个regex演示,568步。.* 在开始时将移动行串末尾的regex索引,然后回溯以找到任何一个 user=admin=.

© www.soinside.com 2019 - 2024. All rights reserved.