REGEX解析日期-使REGEX更贪婪


REGEX parsing Date - make regex more greedy

我想匹配2015年12月13日(分别为天、月、年)的:

ASTA n° 30 | 13/12/2015 ore 10.00 | Arte Moderna & Contemporanea

使用此Regex(PHP-preg_match):

/('d{1,2})'D{1,4}('d{1,2})'D{1,4}('d{4}|'d{2})/imu

我得到了:

30 | 13/12

但我需要2015年12月13日。似乎雷格斯不够贪婪。。。我知道我的Regex有可能与我的对手进行比赛,但我更喜欢''d{4}而不是''d{2}(在最后一轮)。

编辑:我需要''d{2}和''d{1,4}部分更加灵活(有日期如2015年12月13日或2015年12日13日等)。有没有一种方法可以颠倒regex引擎的处理顺序(从结束到开始)?那么它将首先匹配''d{4},然后匹配''d{2}(月和日)?

为什么不简单地说:'d{2}'/'d{2}'/'d{4}(点击regex进行演示)。

你必须是数字,一个斜线,两个数字,再一次是一个斜线和4个数字。

如果你想添加对个位数的支持,例如连字符,你可以这样做:'d{1,2}['/-]'d{1,2}['/-]'d{4}(再次单击regex进行演示)。

根据OP的要求更新,以匹配两位数年份:

('d{1,2}['/-]'d{1,2}['/-](?:'d{4}|'d{2}))演示

此正则表达式添加了一个检查,如果找不到4位数的年份,它将只查找2位数。

编辑2:我把正则表达式缩短了一点——现在日期和月份在同一个正则表达式非捕获组中,但只有当这个正则表达式出现两次时才会匹配。事与愿违,正则表达式:

((?:'d{1,2}['/-]){2}(?:'d{4}|'d{2}))演示

使用

(''d{1,2})''/