我有一个PCRE2表达式,它从一些日志中读取用户名。在日志中,用户名可以选择放在括号中。我需要通过正则表达式获得用户名,当然不需要括号。
日志示例:
msg_id="1100-0005" Authentication of Firewall user [someuser@somehost] from fe80::badd:cafe was rejected, password is incorrect
msg_id="5000-0001" WebUI User anotheruser@anotherhost from 10.0.0.2 log in attempt was rejected - invalid credentials.
我想出的正则表达式(其中组3应该是用户名(:
msg_id="[0-9a-fA-F]{4}-[0-9a-fA-F]{4}"s(Authentication of)?s?(.*s[Uu]ser)s[?(S+)]?s
到目前为止,第一个日志得到someuser@somehost]
,第二个日志得到了anotheruser@anotherhost
。有没有一种方法可以在不使用非贪婪选项的情况下去掉尾括号?
您可以使用
msg_id="[0-9a-fA-F]{4}-[0-9a-fA-F]{4}"(?:s+Authentication of)?s+(.*?s[Uu]ser)s[?([^[]s]+)
请参阅regex演示详细信息:
msg_id="
-文字字符串[0-9a-fA-F]{4}
-四个十六进制字符-
-连字符[0-9a-fA-F]{4}
-四个十六进制字符"
-一个"
字符(?:s+Authentication of)?
-一个或多个空白的可选序列,然后是Authentication of
字符串s+
-一个或多个空白(.*?s[Uu]ser)
-组1:零个或多个字符(换行字符除外(,尽可能少,然后是空白和User
或user
s
-空白[?
-可选的[
字符([^[]s]+)
-第2组:除]
、[
和空白之外的一个或多个字符