使用正则表达式验证出生日期

时间:2014-03-03 23:52:53

标签: regex pattern-matching

我的问题:我发现这项练习非常具有挑战性。我被困在出生日期。

挑战:尝试使用正则表达式来验证以下文本字符串(不要担心不区分大小写):

  1. 名字 - 应由标准英文字母组成,长度在1到10个字符之间。
  2. 中间首字母 - 应由标准英文字母组成,且长度只有一个字符。
  3. 姓氏 - 应由标准英文字母加撇号组成,长度在2到10个字符之间。
  4. 出生日期 - 应在191年1月1日至12月31日之间,并且应为以下日期格式之一:dd / mm / yyyy,dd-mm-yyyy或dd.mm.yyyy
  5. 我能够找到前三个名字。但是我被困在出生日期。

       "^[a-z]{1,10}$",  // First name
       "^[a-z]$",        // Middle initial
       "^[a-z']{2,10}$", // Last name
    

    请帮帮我。

8 个答案:

答案 0 :(得分:5)

这里有几件事要处理:

  1. 仅验证日,月和年值的适当值
  2. 验证正确的元素是否在正确的位置
  3. 验证分隔符是否匹配
  4. 验证它是实际日期
  5. 第一个看起来可能与分组和或。例如,您可以将1-12中的所有值与:

    匹配
    (?:0[1-9]|1[12])
    

    1900 - 2099年

    (?:19|20)\d\d
    

    第二位只是将模式的适当部分放在正确的位置。

    第三部分可以用后引用来完成。首先,您有一个子组来匹配分隔符,如下所示:

    ([\/.-])
    

    接下来,您需要确保在比赛后期再次获得相同的角色。这是通过指定反斜杠后跟组的编号来完成的。例如:

    \1
    

    最后,我们要确保没有人指定1925年6月31日或1994年2月30日。这在正则表达式中完成是绝对可怕的,并且应该迅速让我们为山丘奔跑。正则表达式不是解决该问题的正确方法。 因此,除此之外,我们可以使用正则表达式来解决前三个部分:

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

    注意使用?:使一些分组不能获得子匹配,这样我们只需要处理我们感兴趣的子匹配。不是严格要求,但它使它更清晰。如果你把它们排除在外,那么分隔符将是第二个子组,而不是第一个子组。

答案 1 :(得分:4)

有关日期的正则表达式,请参阅链接:Regex Tutorial

但我认为这个例子可行。

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

答案 2 :(得分:2)

/^((1[0-2])|[1-9])[/-.](3[0-1]|[1-2]\d|[1-9])[/-.][19|20]\d{2}$/

答案 3 :(得分:1)

对于出生日期,您在字符串的开头匹配,然后对于月份部分,您有一个捕获组以匹配01,02,03,04,05,06,07,08,09中的一个, 10,11或12,然后是另一个捕获组以匹配 - ,/

对于日期部分,您需要捕获组以匹配01,02,... 29,30或31中的一个,然后捕获组以匹配 - ,/或

出生日期:

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

答案 4 :(得分:1)

尝试

/^((1[0-2])|[1-9])[/-.](3[0-1]|[1-2]\d|[1-9])[/-.][19|20]\d{2}$/

答案 5 :(得分:1)

对于出生日期,匹配字符串的开头,然后对于月份部分,您有一个捕获组,以匹配01,02,03,04,05,06,07,08,09,10中的一个,11或12,然后是另一个捕获组,以匹配 - ,/

我认为这个例子可行。

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

答案 6 :(得分:1)

@Coenwulf有一个很棒的解释,我很自然地选择了它。 但是实际上有一个错误,应该修复为:

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

否则,如果月份为10,日期将无法生效。

更改在(?:0[1-9]|1[012])中,您应阅读:

  • (?: )是一个非捕获组(允许表达)
  • 0[1-9]允许0后跟1到9的数字
  • 1[012]允许1后跟数字0、1或2之一
  • 两者之间的|表示“或”

希望有帮助。

答案 7 :(得分:0)

尝试

(2, 5)