.NET正则表达式,用于检查长度和非字母数字字符
我需要Regexp来validation字符串是否具有最小长度6并且它包含至少一个非字母数字字符,例如: "eN%{S$u)"
, "h9YI!>4j"
, "{9YI!;4j"
, "eN%{S$usdf)"
, "dfh9YI!>4j"
, "ghffg{9YI!;4j"
。
这个工作得很好^.*(?=.{6,})(?=.*\\d).*$"
但是在字符串不包含任何数字的情况下(例如"eN%{S$u)"
)它无法正常工作。
^(?=.{6})(.*[^0-9a-zA-Z].*)$
我们使用正向前瞻来确保至少有6个字符。 然后我们匹配寻找至少一个非字母数字字符( [^0-9a-zA-Z]
)的模式。 .*
匹配这个非字母数字字符周围的任意数字,但到我们到达这里时,我们已经检查过我们匹配至少6个。
^.*(?=.{6,})(?=.*\\d).*$"
是你试过的正则表达式。 以下是一些建议:
- 您不需要在前瞻中匹配超过6个字符。 这里仅匹配6不会限制正则表达式的其余部分匹配超过6。
-
\d
匹配一个数字,(?=.*\\d)
是其中之一的预测。 这就是为什么你遇到了像eN%{S$u)
这样的字符串所提到的问题。 - 即使上面的点不正确并且这里的正则表达式是正确的,你也可以将第二个前瞻与后面的
.*
结合使用.*\\d.*
。
marcog的答案非常好,但我会反过来这样做,以便更容易添加更多条件(例如至少有一个数字或其他),并且我会使用惰性量词因为它们更便宜图案:
^(?=.*?[^0-9a-zA-Z]).{6}
因此,如果您要添加上述附加条件,它将是这样的:
^(?=.*?[^0-9a-zA-Z])(?=.*?[0-9]).{6}
如您所见,此模式很容易扩展。 注意,它仅用于检查匹配,其捕获无用。
保持简单。
// long enough and contains something not digit or az x.Length >= 6 && Regex.IsMatch(x, @"[^\da-zA-Z]")
快乐的编码。
编辑,纯粹的“正则表达式”:
第一个断言前瞻中有6个字母,然后确保在前瞻中有一些不是字母数字的东西(它会“扔掉”到前5个字符试图匹配) 。
(?=.{6}).{0,5}[^\da-zA-Z]
怎么样(固定): ^(?=.{6})(.*[^\w].*)$
请查看http://www.ultrapico.com/Expresso.htm这是一个很酷的工具,可以帮助你在Regexps学习中做很多事情。