REGEX parsing Date - 使正则表达式更贪心

REGEX parsing Date - make regex more greedy

我要匹配 13/12/2015(日、月、年分开)的:

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

使用此正则表达式 (PHP - preg_match):

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

我得到了:

30 | 13/12

但我需要 13/12/2015。 似乎 Regex 不够贪婪......我知道我的 Regex 可能会得到匹配,但我想更喜欢 \d{4} 而不是 \d{2} (在最后一个圆括号中)。

编辑: 我需要 \d{2} 和 \D{1,4} 部分更灵活(有像 13.10.15 或 13th 12.2015 这样的日期, ETC。)。 有没有办法反转正则表达式引擎的处理顺序(端到开始)?所以它会先匹配\d{4}然后匹配\d{2}(月和日)?

为什么不简单地这样:\d{2}\/\d{2}\/\d{4}(单击正则表达式进行演示)。

您必须输入数字、斜线、两位数字、斜线和 4 位数字。

如果您想添加对单个数字的支持,例如连字符,您可以这样做:\d{1,2}[\/-]\d{1,2}[\/-]\d{4}(再次单击正则表达式进行演示)。

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

(\d{1,2}[\/-]\d{1,2}[\/-](?:\d{4}|\d{2})) DEMO

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

编辑 2:我稍微缩短了正则表达式 - 现在日期和月份在同一个正则表达式非捕获组中,但仅当此正则表达式出现两次时才会匹配。事不宜迟,正则表达式:

((?:\d{1,2}[\/-]){2}(?:\d{4}|\d{2})) DEMO

使用

(\d{1,2})\/(\d{1,2})\/(\d{4}|\d{2})