上一个匹配的正则表达式依赖项



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

表达式将有一些但不是太多的验证。例如,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!

最新更新