正则表达式包括可选组,重复匹配所有组

时间:2014-12-04 01:47:59

标签: regex

所以这是我的窘境:

^.*System(.*)(\d{4}-\d{2}-\d{2})?\.log

我需要一个与括号中的可选组匹配的正则表达式(日期)。 但是,由于此组是可选的,并且.+是"渴望",日期组从不参与匹配。所以我想尝试匹配这些东西:

/var/log/ws/SystemOut.appserver204.log
/var/log/ws/SystemOut.appserver204.2014-10-22.log
/var/log/ws/SystemErr.appserver208.log
/var/log/ws/SystemErr.appserver212.2014-11-12.log

但是,第一个群组(.+)始终会将所有内容都提取到.log,从而导致可选日期组永远不会参与匹配。如果我没有让小组成为可选组,我会开始包括日期,但是上面提到的其中两个案例不会匹配。

我该怎样做我想要完成的事情? (供参考,我在Java工作。)

3 个答案:

答案 0 :(得分:1)

*greedy运算符,意味着它将尽可能多地匹配,并且仍然允许正则表达式的其余部分匹配。使用*?表示非贪婪匹配,表示“零或更多 - 最好尽可能少”。

^.*System.*?(\d{4}-\d{2}-\d{2})?\.log

Live Demo

答案 1 :(得分:0)

^.*System.*\.(\d\d\d\d-\d\d-\d\d)\.log$

应该这样做。

答案 2 :(得分:0)

看看this sample。正则表达式^.*System(.+?)\.?(\d{4}-\d{2}-\d{2})?\.log匹配组1中的文本和组2中的日期(不包括点)。可视化:

Regex visualization