0

我想从这个字符串中捕获组数 -

%May 11 10:03:49:448 2000 AB-CDE SHELL/6/SHELL_CMD: -Task=vt0-IPAddr=172.0.0.0-User=manager; Command is display info
%May 11 10:03:51:122 2000 AB-CD-E SSH/6/SSH_LOGOUT: STEL user manager (IP: 172.0.0.0) logged out.

我写的正则表达式如下 -

^%(\w{3})\s+(\d+)\s*([0-9]+\s?:\s?[0-9]+\s?:\s?[0-9]+):[0-9]+\s*(\d{4})?\s*\S*\s*(.*)/(\d+)/\S*:(.*);(.*)

这从第一行捕获以下组 -

1. Group: May
2. Group: 11
3. Group: 10:03:49
4. Group: 2000
5. Group: SHELL
6. Group: 6
7. Group: -Task=vt0-IPAddr=172.0.0.0-User=manager
8. Group: Command is display info

这不会选择第二行,因为它没有 ; 在最后一节。

我尝试将第 7 组设为可选

^%(\w{3})\s+(\d+)\s*([0-9]+\s?:\s?[0-9]+\s?:\s?[0-9]+):[0-9]+\s*(\d{4})?\s*\S*\s*(.*)/(\d+)/\S*:(.*);?(.*)

输出:

1.1 Group: May
1.2. Group: 11
1.3. Group: 10:03:49
1.4. Group: 2000
1.5. Group: SHELL
1.6. Group: 6
1.7. Group: -Task=vt0-IPAddr=172.0.0.0-User=manager; Command is display info
1.8. Group:

2.1. Group: May
2.2. Group: 11
2.3. Group: 10:03:51
2.4. Group: 2000
2.5. Group: SSH
2.6. Group: 6
2.7. Group: STEL user manager (IP: 172.0.0.0) logged out.
2.8. Group:

但它仍然不符合我的要求。为什么 1.7 行即使有也不会溢出;我希望 2.7 输出进入 2.8 并且 2.7 应该像第二行没有的那样为空;

有什么方法可以使用正则表达式来实现这一点?

4

1 回答 1

1

使用非捕获可选组 ( (?:)):

^%(\w{3})\s+(\d+)\s*([0-9]+\s?:\s?[0-9]+\s?:\s?[0-9]+):[0-9]+\s*(\d{4})?\s*\S*\s*(.*)/(\d+)/\S*:(?:(.*);)?(.*)

这将使第 7 组成为可选的。

用法:https ://regex101.com/r/oS3bN6/1

于 2016-06-22T05:45:41.443 回答