Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式包含可选组,重复匹配所有组_Regex - Fatal编程技术网

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