我写了一个简单的提取用户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中的第一个模式,会取消一些针对以更特定模式开始的模式的优化。
由于您的替代组匹配 =
分隔的字符串,你可以把它放在模式的开头,然后使用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=
.