需要改进正则表达式
Need improvement on the 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"]
替代组作为正则表达式中的第一个模式取消了一些针对以更具体的模式开头的模式的优化。
由于您的备选方案匹配 =
定界字符串,您可以将其放在模式的开头,然后使用环视,如 中那样。这是一个包含 139 个步骤的小变体:
=(?:(?<=user=)"(?<user1>\w+)|(?<=admin=)"(?<user2>\w+))
见regex demo。详情
=
- 等号
(?:(?<=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+))
参见 this regex demo,共 918 步。
如果您知道匹配项位于接近行尾的某个位置,请使用
.*\b(?:user="(?<user1>\w+)|admin="(?<user2>\w+))
参见 this regex demo,568 步。 .*
在开始时会将正则表达式索引移动到 line/string 的末尾,然后回溯以找到 user=
或 admin=
.
我写了一个简单的正则表达式来提取用户 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"]
替代组作为正则表达式中的第一个模式取消了一些针对以更具体的模式开头的模式的优化。
由于您的备选方案匹配 =
定界字符串,您可以将其放在模式的开头,然后使用环视,如
=(?:(?<=user=)"(?<user1>\w+)|(?<=admin=)"(?<user2>\w+))
见regex demo。详情
=
- 等号(?:(?<=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+))
参见 this regex demo,共 918 步。
如果您知道匹配项位于接近行尾的某个位置,请使用
.*\b(?:user="(?<user1>\w+)|admin="(?<user2>\w+))
参见 this regex demo,568 步。 .*
在开始时会将正则表达式索引移动到 line/string 的末尾,然后回溯以找到 user=
或 admin=
.