如果我必须匹配一个长度至少为 7 个字符、不超过 20 个字符、至少有 1 个数字和至少 1 个字母的字符串,这个正则表达式是否正确?它没有其他限制。
[0-9]+[A-Za-z]+{7,20}
谢谢
不,这不对。量词{7,20}
不适用于标记(正则表达式中的重复是使用量词完成的,例如*
,或更一般的- 您不能在单个标记上使用多个量词[在这种情况下];它本身就是一个量词并且因此不遵守上述规则)。您将需要以下内容:+
?
{n,m}
[a-zA-Z]
*?
^(?=.*\d)(?=.*[a-zA-Z]).{7,20}$
这有两个前瞻确保至少一个数字和至少一个字母:
(?=.*\d)
(?=.*[a-zA-Z])
Lookarounds 是零宽度的断言;它们不消耗字符串中的字符,因此它们只是匹配一个位置。但他们确保其中的表达式在当前点匹配。在这种情况下,此表达式将匹配任意多个字符,然后分别需要一个数字或一个字母。
实际比赛本身,
.{7,20}
只是确保长度匹配。使用什么字符无关紧要,因为我们已经确定了上面的限制。
最后,整个表达式被锚定在字符串的开头和结尾锚点插入到开头和结尾:
^...$
这可以确保匹配真正包含整个字符串。虽然在这种情况下不是绝对必要的(在所有有效情况下它都会匹配整个字符串),但包含通常是一个好主意,因为通常正则表达式只匹配子字符串,这可能会导致验证正则表达式匹配的微妙问题,即使它们应该失败。例如,\d+
用于确保字符串仅包含数字将匹配a4b
经常困扰初学者的字符串。
我还更改了字母和数字的顺序无关紧要。您的正则表达式看起来像是试图强加一个明确的顺序,其中所有数字都需要在所有字母之前,这通常不是这里想要的。