所以这是我的窘境:
^.*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工作。)
答案 0 :(得分:1)
*
是greedy运算符,意味着它将尽可能多地匹配,并且仍然允许正则表达式的其余部分匹配。使用*?
表示非贪婪匹配,表示“零或更多 - 最好尽可能少”。
^.*System.*?(\d{4}-\d{2}-\d{2})?\.log
答案 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中的日期(不包括点)。可视化: