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


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

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


3911
2018-01-08 06:50


起源



答案:


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

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

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

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

  • 您不需要在前瞻中匹配超过6个字符。这里仅匹配6不会限制正则表达式的其余部分匹配超过6。
  • \d 匹配一个数字,和 (?=.*\\d) 对其中一个人来说是一个先行者。这就是为什么你遇到了你提到的字符串之类的问题 eN%{S$u)
  • 即使上面的点不正确并且此处的正则表达式是正确的,您也可以将第二个前瞻与前导相结合 .* 只需使用即可 .*\\d.*

11
2018-01-08 09:33





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

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

因此,如果您要添加上述附加条件,它将是这样的:

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

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


3
2018-01-08 10:57





保持简单。

// 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]

1
2018-01-08 07:09



我在配置文件中保留regexps,我不能这样做。 - Reg
此输入失败: lucero-1 - Lucero
@Lucero再次检查。那个输入不会失败。它传递正则表达式,如要求中所述 - “字符串具有最小长度6并且它至少包含一个非字母数字字符”。在这种情况下,“ - ”满足第二个要求,以及第一个要求的长度。顺便提一下你的回答很好。顺便说一下。
@Lucero我因为第二个'而没有锚点而离开了。'匹配限制。
对不起,你当然是对的。我不知何故错过了省略的锚,我的不好。为此+1。 ;-) - Lucero


答案:


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

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

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

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

  • 您不需要在前瞻中匹配超过6个字符。这里仅匹配6不会限制正则表达式的其余部分匹配超过6。
  • \d 匹配一个数字,和 (?=.*\\d) 对其中一个人来说是一个先行者。这就是为什么你遇到了你提到的字符串之类的问题 eN%{S$u)
  • 即使上面的点不正确并且此处的正则表达式是正确的,您也可以将第二个前瞻与前导相结合 .* 只需使用即可 .*\\d.*

11
2018-01-08 09:33





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

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

因此,如果您要添加上述附加条件,它将是这样的:

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

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


3
2018-01-08 10:57





保持简单。

// 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]

1
2018-01-08 07:09



我在配置文件中保留regexps,我不能这样做。 - Reg
此输入失败: lucero-1 - Lucero
@Lucero再次检查。那个输入不会失败。它传递正则表达式,如要求中所述 - “字符串具有最小长度6并且它至少包含一个非字母数字字符”。在这种情况下,“ - ”满足第二个要求,以及第一个要求的长度。顺便提一下你的回答很好。顺便说一下。
@Lucero我因为第二个'而没有锚点而离开了。'匹配限制。
对不起,你当然是对的。我不知何故错过了省略的锚,我的不好。为此+1。 ;-) - Lucero


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

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


0
2018-01-08 07:15



检查输入 !@#$%^
看起来表达式是以某种方式被破坏了(我希望看到一些 .* 和 \w 在他们各自的地方表达有意义)。 - Lucero
你在其中一个编辑中删除了一个反斜杠。 [^w] 应该是 [^\w] 要么 \W。 - Alan Moore