Nin*_*jaG 2 regex pattern-matching
我的问题:我发现这项练习非常具有挑战性.我被困在出生日期.
挑战:尝试使用正则表达式来验证以下文本字符串(不要担心不区分大小写):
我能够拿到前三个名字.但是我被困在出生日期.
"^[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)
这里有几个要处理的事项:
第一个看起来可能与分组和或.例如,您可以匹配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)
注意使用?:使一些分组不能获得子匹配,这样我们只需要处理我们感兴趣的子匹配.不是严格要求,但它使它更清晰.如果你把它们排除在外,那么分隔符将是第二个子组,而不是第一个子组.
@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 之一|两者之间的意思是“或”希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
14941 次 |
| 最近记录: |