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