我正在阅读正则表达式,我正在尝试制作一个与日期/月/年格式的日期匹配的表达式。
表达式将有一些但不是太多的验证。例如,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# 中使用表达式。
引用2
可以解决您的问题:
^(19|20)dd([- /.])(0[1-9]|1[012])2(0[1-9]|[12][0-9]|3[01])$
有关详细信息,请阅读本文。
这是我的答案:
([0-2]d|30|31)(/.-)(0d|1[0-2])2d{4}
使用反向引用 \2 并首选 \d 而不是 [0-9]
在搜索模式中使用反向引用(1
),类似于(语法未经测试)
d+([-./])d+1d+
或者更详细(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!