我正在阅读正则表达式,我正在尝试制作一个与日期/月/年格式相匹配的表达式。
表达式将有一些但没有太多验证。 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#中使用表达式。
答案 0 :(得分:1)
答案 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!)