.NET正则表达式,用于检查长度和非字母数字字符

时间:2011-01-08 06:50:30

标签: c# .net regex

我需要Regexp来验证字符串的最小长度为6,并且它至少包含一个非字母数字字符,例如:"eN%{S$u)""h9YI!>4j""{9YI!;4j""eN%{S$usdf)""dfh9YI!>4j""ghffg{9YI!;4j"

这个工作正常^.*(?=.{6,})(?=.*\\d).*$"但是在字符串不包含任何数字(例如"eN%{S$u)")的情况下,它不起作用。

4 个答案:

答案 0 :(得分:11)

^(?=.{6})(.*[^0-9a-zA-Z].*)$

我们使用正向前瞻来确保至少有6个字符。然后我们匹配查找至少一个非字母数字字符([^0-9a-zA-Z])的模式。 .*匹配这个非字母数字字符周围的任意数字,但到我们到达此处时,我们已经检查过我们匹配的字符数至少为6。

^.*(?=.{6,})(?=.*\\d).*$"

是你试过的正则表达式。以下是一些建议:

  • 前瞻中不需要匹配超过6个字符。此处仅匹配6不会限制正则表达式的其余部分匹配超过6。
  • \d匹配一个数字,(?=.*\\d)是其中一个数字的预测。这就是您遇到类似eN%{S$u)等字符串时遇到的问题的原因。
  • 即使上述点不正确且此处的正则表达式正确,您也可以使用.*将第二个前瞻与后面的.*\\d.*结合使用。

答案 1 :(得分:3)

marcog的回答非常好,但我会反过来这样做,以便更容易添加更多条件(例如至少有一个数字或其他),并且我会使用惰性量词,因为它们是某些模式更便宜:

^(?=.*?[^0-9a-zA-Z]).{6}

因此,如果您要添加上述附加条件,则可能是这样的:

^(?=.*?[^0-9a-zA-Z])(?=.*?[0-9]).{6}

如您所见,此模式易于扩展。请注意,is is仅用于检查匹配,其捕获无用。

答案 2 :(得分:1)

保持简单。

// long enough  and  contains something not digit or a-z
x.Length >= 6   &&   Regex.IsMatch(x, @"[^\da-zA-Z]")

快乐的编码。

编辑,纯粹的“正则表达式”:

这首先声明在前瞻中有6个字母,然后确保在前瞻中有一些不是字母数字的东西(它会“扔掉”直到前5个字符尝试匹配)。

(?=.{6}).{0,5}[^\da-zA-Z]

答案 3 :(得分:0)

那(固定):^(?=.{6})(.*[^\w].*)$

检查一下http://www.ultrapico.com/Expresso.htm这是一个很酷的工具,它可以帮助你在Regexps学习中获得很多。