2012-04-17 49 views
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#中的表达。

回答

1

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

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

阅读本article了解详情。

0

这里是我的回答:

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

使用后向引用\ 2,喜欢\ d为[0-9]

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

相关问题