0

我正在阅读正则表达式,我正在尝试制作一个匹配日期/月/年格式的日期的表达式。

该表达式将有一些但不多的验证。例如04/17/2012,不是有效日期,因为没有第 17 个月。

我正在制作表达式,以便分隔符可以是/, .-.现在我希望它是组件之间的相同分隔符。有没有办法调整正则表达式,以便如果它匹配/日期和月份之间的分隔符(或任何其他),那么它只会匹配/月份和年份之间的分隔符(或之前匹配的分隔符)?

这是我现在的表达方式:

(0[1-9]|[1-2][0-9]|3[0-1]|[1-9])(/|\.( |)|-)(0[1-9]|1[0-2]|[1-9])(/|\.( |)|-)([0-9]{4}|[0-9]{2})

我将使用 C# 中的表达式。

4

3 回答 3

1

反向引用\2可以解决您的问题:

^(19|20)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$

阅读这篇文章了解详情。

于 2012-04-17T08:59:00.130 回答
0

这是我的答案:

([0-2]\d|30|31)(/.-)(0\d|1[0-2])\2\d{4}

使用反向引用 \2 并更喜欢 \d 到 [0-9]

于 2012-04-17T09:11:26.883 回答
0

在您的搜索模式中使用反向引用 ( \1),例如 (syntax untested)

\d+([-./])\d+\1\d+

或更详细地说(Python)

>>> pat = re.compile(r"""
... \d{2}          # day
... ([-./])        # separator
... \d{2}
... \1             # repeat of first separator
... \d{4}          # year
... """, re.VERBOSE )
>>> mystr
'The date is 17/04/2012'
>>> result = pat.search(mystr)
>>> result.group()
'17/04/2012'

然后\1应该匹配[-./]为第一个分隔符获得的任何一个。

如果您确实想为生产目的执行此操作,则最好使用通用模式定位日期,然后使用适当的日期解析模块对其进行解析。这是因为日期有很多难以编码成正则表达式的边缘情况。(快速:给我写一个正确允许 29/02/2000,但不允许 29/02/2001 的正则表达式!)

于 2012-04-17T09:11:34.323 回答