.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学习中做很多事情。