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

kar*_*n k 1 c# regex

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

[0-9]+[A-Za-z]+{7,20}
Run Code Online (Sandbox Code Playgroud)

谢谢

Joe*_*oey 9

不,这不对.量词{7,20}并不适用于令牌(在正则表达式的重复与做量词,如*,+,?或更一般的{n,m},你不能使用超过对单个令牌[在这种情况下,一个量词- [a-zA-Z]] *?是对自己一个量词和因此不符合上述规则).您需要以下内容:

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

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

(?=.*\d)
(?=.*[a-zA-Z])
Run Code Online (Sandbox Code Playgroud)

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

实际匹配本身,

.{7,20}
Run Code Online (Sandbox Code Playgroud)

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

最后整个表达锚定在一个起动的字符串结束串锚被插入在所述开始和结束:

^...$
Run Code Online (Sandbox Code Playgroud)

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

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

  • +1为优雅的解决方案.最终的标记应该是`$`而不是`^`. (2认同)