2

如果我必须匹配一个长度至少为 7 个字符、不超过 20 个字符、至少有 1 个数字和至少 1 个字母的字符串,这个正则表达式是否正确?它没有其他限制。

[0-9]+[A-Za-z]+{7,20}

谢谢

4

1 回答 1

9

不,这不对。量词{7,20}不适用于标记(正则表达式中的重复是使用量词完成的,例如*,或更一般的- 您不能在单个标记上使用多个量词[在这种情况下];它本身就是一个量词并且因此不遵守上述规则)。您将需要以下内容:+?{n,m}[a-zA-Z]*?

^(?=.*\d)(?=.*[a-zA-Z]).{7,20}$

这有两个前瞻确保至少一个数字和至少一个字母:

(?=.*\d)
(?=.*[a-zA-Z])

Lookarounds 是零宽度的断言;它们不消耗字符串中的字符,因此它们只是匹配一个位置。但他们确保其中的表达式在当前点匹配。在这种情况下,此表达式将匹配任意多个字符,然后分别需要一个数字或一个字母。

实际比赛本身,

.{7,20}

只是确保长度匹配。使用什么字符无关紧要,因为我们已经确定了上面的限制。

最后,整个表达式被锚定字符串的开头和结尾锚点插入到开头和结尾:

^...$

这可以确保匹配真正包含整个字符串。虽然在这种情况下不是绝对必要的(在所有有效情况下它都会匹配整个字符串),但包含通常是一个好主意,因为通常正则表达式只匹配子字符串,这可能会导致验证正则表达式匹配的微妙问题,即使它们应该失败。例如,\d+用于确保字符串仅包含数字将匹配a4b经常困扰初学者的字符串。

我还更改了字母和数字的顺序无关紧要。您的正则表达式看起来像是试图强加一个明确的顺序,其中所有数字都需要在所有字母之前,这通常不是这里想要的。

于 2012-06-27T09:07:15.437 回答