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

Nin*_*jaG 2 regex pattern-matching

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

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

  1. 名字 - 应由标准英文字母组成,长度在1到10个字符之间.
  2. 初始中间 - 应由标准英文字母组成,长度只有一个字符.
  3. 姓氏 - 应由标准英文字母加撇号组成,长度在2到10个字符之间.
  4. 出生日期 - 应该在1/1/1900和12/31/2099之间,并且应该是以下日期格式之一:dd/mm/yyyy,dd-mm-yyyy或dd.mm.yyyy.

我能够拿到前三个名字.但是我被困在出生日期.

   "^[a-z]{1,10}$",  // First name
   "^[a-z]$",        // Middle initial
   "^[a-z']{2,10}$", // Last name
Run Code Online (Sandbox Code Playgroud)

请帮我.

小智 9

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

但我认为这个例子会奏效。

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


Coe*_*ulf 7

这里有几个要处理的事项:

  1. 仅验证日,月和年值的适当值
  2. 验证正确的元素是否在正确的位置
  3. 验证分隔符是否匹配
  4. 验证它是实际日期

第一个看起来可能与分组和或.例如,您可以匹配1-12中的所有值:

(?:0[1-9]|1[12])
Run Code Online (Sandbox Code Playgroud)

和1900年至2099年

(?:19|20)\d\d
Run Code Online (Sandbox Code Playgroud)

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

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

([\/.-])
Run Code Online (Sandbox Code Playgroud)

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

\1
Run Code Online (Sandbox Code Playgroud)

最后,我们要确保没有人指定1925年6月31日或1994年2月30日.这在正则表达式中完成是非常可怕的,并且应该迅速让我们为山丘奔跑.正则表达式不是解决该问题的正确方法.所以把它放在一边我们可以使用正则表达式来解决前三个部分:

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

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


ant*_*oni 5

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

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

否则,如果月份是 ,则日期将无效10

更改位于(?:0[1-9]|1[012]),您应该阅读:

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

希望能帮助到你。