如何为带有或不带连字符的ISO8601格式编写出生日期正则表达式?

时间:2016-06-29 14:37:27

标签: c# regex

我想要一个正则表达式来验证ISO 8601格式的出生日期,如下所示:1987-10-20并且没有连字符19871020。

正则表达式我使用连字符:

> @"^(19|20)[0-9]{2}[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])$";

这个接受空格或连字符

@"^(19|20)[0-9]{2}( *|-)(0[1-9]|1[012])( *|-)(0[1-9]|[12][0-9]|3[01])$";

如何编写 nothing 而不是空格?

由于

大卫

1 个答案:

答案 0 :(得分:1)

您正在使用量词*作为空格:( *|-)*的含义是:无限之间,尽可能多次,根据需要回馈

这意味着,截至目前19871020将被接受为1987 10 20甚至1987 1020

我建议使用后向引用和捕获组:

@"^(19|20)[0-9]{2}([ -]?)(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$";

([ -]?)将允许0或1个空格或-\2将引用所使用的第一个分隔符。因此1987-10-20将被接受,而198710-20则不会。这对于维护非常有用,如果你想在不久的将来允许另一个分隔符,你将只需要更新一个地方就可以完成这项工作。