前一场比赛的正则表达式依赖

时间:2012-04-17 08:57:00

标签: c# regex

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

表达式将有一些但没有太多验证。 E.g 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#中使用表达式。

3 个答案:

答案 0 :(得分:1)

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

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

阅读此article了解详情。

答案 1 :(得分:0)

以下是我的回答:

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

使用返回参考\ 2并更喜欢\ d到[0-9]

答案 2 :(得分:0)

在搜索模式中使用反向引用(\1),类似(语法未经测试)

\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!)