正则表达式:如何捕获可选组

时间:2016-06-22 05:38:36

标签: java regex capture-group

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

%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应该是空的,因为第二行没有;

我们有什么方法可以使用正则表达式实现这一目标吗?

1 个答案:

答案 0 :(得分: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