我的C#Reg-ex是否正确?

时间:2012-06-27 09:05:19

标签: c# regex

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

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

由于

1 个答案:

答案 0 :(得分:9)

不,不是。量词{7,20}不适用于令牌(正则表达式中的重复是使用量词完成的,例如*+?或更一般{n,m} - 您不能在单个令牌上使用多个量词[在本例中为[a-zA-Z]]; *?本身就是一个量词,因此不符合上述规则)。您需要以下内容:

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

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

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

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

实际匹配本身,

.{7,20}

确保长度匹配。使用哪些字符是无关紧要的,因为我们已经确定了上述约束。

最后,整个表达式是锚定,因为在开始时插入字符串开头字符串结尾锚点并结束:

^...$

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

我还改变了字母和数字的顺序无关紧要。你的正则表达式似乎试图强加一个明确的顺序,所有数字都需要在所有通常不是这里所需的字母之前出现。