Regex 正则表达式包含可选组,重复匹配所有组
这就是我的困惑:Regex 正则表达式包含可选组,重复匹配所有组,regex,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
^.*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中工作。)
应该这样做。*
是一个运算符,意味着它将尽可能多地匹配,并且仍然允许正则表达式的其余部分匹配。使用*?
进行非贪婪匹配,表示“零或更多-最好尽可能少”
看看。regex^.*System(+?)\.?(\d{4}-\d{2}-\d{2})\.log
匹配组1中的文本和组2中的日期(不包括点)。可视化:
所以需要返回日期,对吗?@Khanna111不仅仅是日期,整个事情都必须匹配,但是如果日期存在,就需要匹配。如果没有,就不要说了。他一针见血,太棒了。这是其中一个不容易在谷歌上搜索如何让regex不贪婪地抓住所有人的地方。
^.*System.*\.(\d\d\d\d-\d\d-\d\d)\.log$
^.*System.*?(\d{4}-\d{2}-\d{2})?\.log