【问题标题】:REGEX parsing Date - make regex more greedy [duplicate]正则表达式解析日期 - 使正则表达式更贪婪[重复]
【发布时间】:2015-12-11 12:34:42
【问题描述】:

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

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

但我需要 2015 年 12 月 13 日。 似乎正则表达式不够贪婪......我知道我的正则表达式可以匹配我得到的匹配,但我更喜欢 \d{4} 而不是 \d{2} (在最后一个圆括号中)。

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

【问题讨论】:

  • 一般的方法是使用正则表达式提取日期,不检查日期是否有效,然后使用适当的方法验证它,它更可靠,尤其是正则表达式不会检查许多方面,如 29.02 : P
  • 是的,我知道 ;) 我检查了 40 种不同的语言和 30 种不同的放置模式(如 2015 年 20 月 10 日、2015 年 12 月 2 日、2015 年 9 月 2 日 3 日和 4 日等)我的规则尝试提取一个日期,然后使用解析 DateTime 类进行验证...

标签: php regex date parsing greedy


【解决方案1】:

为什么不这么简单:\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

【讨论】:

  • 有时有一个年份只有两位数的日期......这也应该匹配......像 13.10.15......但是如果有一个年份有 4 位数,这种情况应该是首选。
  • @mfuesslin 我已经更新了我的答案以匹配两位数的年份。如果回答了您的问题,请记住标记已接受的答案。
  • 你的方法很好!有没有办法用 \D 而不是字符类 [\/-] 来做到这一点?我已经接受了您的回答,因为它可以满足我的要求(但我仍然需要探索我必须在字符类中添加的内容以匹配我所有的日期变体)。 \D 只是为了更灵活,因为我无法通过 250000 个日期来获取字符类所需的所有字符(“日期分隔符”)
  • @mfuesslin 你当然可以使用\D,但这将允许太多无效选项,例如日期中未使用的字母和符号 - 我猜你不想允许日期这种格式:12$05&15 ;) 字符类是最简单的。您可以通过允许日期和月份是相同的正则表达式来缩短它一点点,只有一个字符类用于日期分隔符,正如您所说的那样。然而,这一切都假设无论如何都是最后一年。我将编辑我的答案以添加它。
【解决方案2】:

使用

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

【讨论】:

  • \D 匹配任何非数字,导致问题
  • 抱歉,这是一个复制粘贴错误。谢谢@Asunez
  • 这将匹配它 - 当然。但我需要一种更通用的方法,因为我必须匹配 40 种不同的语言/多种日期格式......比如 13.12.2015、13-12-2015、13.12.15、13/12/15 等。我需要一些灵活性,因此我选择了\D。我只是想知道是否有一种机制可以让我更喜欢匹配组......也许可以通过正则表达式引擎来反转正则表达式解析?所以它会尝试从字符串的端到端解析?我认为它匹配错误的方式,因为它是引擎找到的第一个解决方案......
猜你喜欢
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2010-10-20
相关资源
最近更新 更多