我的问题:我发现这项练习非常具有挑战性。我被困在出生日期。
挑战:尝试使用正则表达式来验证以下文本字符串(不要担心不区分大小写):
我能够找到前三个名字。但是我被困在出生日期。
"^[a-z]{1,10}$", // First name
"^[a-z]$", // Middle initial
"^[a-z']{2,10}$", // Last name
请帮帮我。
答案 0 :(得分: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)