条件正则表达式,如何提取匹配的子集?

时间:2013-08-08 17:00:01

标签: regex syslog

我有syslog字符串,如下所示:

lwiod[2469]: S-1-5-21-2071757552-4033313730-2397045981-3628|0xC94F000|LOGON|STATUS_SUCCESS|10.10.19.10|10.10.42.40|COMPANY\USERNAME
lwiod[2469]: S-1-5-21-2071757552-4033313730-2397045981-3628|0xC94F000|LOGON|STATUS_SUCCESS|10.10.19.10|10.10.42.40|USERNAME@COMPANY
lwiod[2469]: S-1-5-21-2071757552-4033313730-2397045981-3628|0xC94F000|LOGON|STATUS_SUCCESS|10.10.19.10|10.10.42.40|UNKNOWN

我有一个正则表达式来捕捉我需要的一切,比如:

lwiod\[([0-9]+)\]: (.*)\|(.*)\|LOGON\|STATUS_(.*)\|(.*)\|(.*)\|(COMPANY\\.*|.*\@COMPANY|UNKNOWN)

我还需要regexp做的只是在字段7中给我USERNAME或UNKNOWN,我不想要COMPANY(这是一个AD域名),但我遇到了麻烦。

字段1将是S-1-5-21-2071757552-4033313730-2397045981-3628,2将是0xC94F000,...并且7将是USERNAME或UNKNOWN。

谢谢!

3 个答案:

答案 0 :(得分:2)

根据您的语言,只需拆分管道并抓住最后一个元素。没有必要使用正则表达式!

在C#.NET中:

var myString = "lwiod[2469]: S-1-5-21-2071757552-4033313730-2397045981-3628|0xC94F000|LOGON|STATUS_SUCCESS|10.10.19.10|10.10.42.40|COMPANY\USERNAME"
var login = myString.Split('|').Last();
if (login.contains("\"))
{
    login = login.Split('\').Last();
}

答案 1 :(得分:2)

好吧,我猜你可能会用这样的东西吗?

lwiod\[([0-9]+)\]: (.*)\|(.*)\|LOGON\|STATUS_(.*)\|(.*)\|(.*)\|(?:COMPANY\\)?(UNKNOWN|[^@]+)(?:@)?

从目前的正则表达式来看,似乎COMPANY是原样,所以我假设相同。否则,我想你可以使用

lwiod\[([0-9]+)\]: (.*)\|(.*)\|LOGON\|STATUS_(.*)\|(.*)\|(.*)\|(?:[^\\]*\\)?(UNKNOWN|[^@]+)(?:@)?

答案 2 :(得分:0)

这将为您提供所需的所有字段。要删除公司,你必须添加更复杂的正则表达式,我现在就开始写。

您可以使用组将其捕获到后引用中:

: ([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)\|(?:COMPANY\\)?([^|@]+)(?:@COMPANY)?$

这会让你所有的小组都进入后面的参考文献1-7。

backreference \ 7是您没有公司的用户名。