【问题标题】:Regex for password that requires one numeric or one non-alphanumeric character需要一个数字或一个非字母数字字符的密码的正则表达式
【发布时间】:2010-01-04 05:11:33
【问题描述】:

我正在寻找一个相当具体的正则表达式,我几乎拥有它,但并不完全。

我想要一个至少需要 5 个字符的正则表达式,其中至少一个字符是要么 数字值 非字母数字字符。

这是我目前所拥有的:

^(?=.*[\d]|[!@#$%\^*()_\-+=\[{\]};:|\./])(?=.*[a-z]).{5,20}$

所以问题出在“或”部分。它将允许非字母数字值,但仍需要至少一个数字值。你可以看到我有 or 运算符“|”在我需要的数字和非字母数字之间,但这似乎不起作用。

任何建议都会很棒。

【问题讨论】:

  • 对于非字母数字字符,您可以使用 \W (非单词字符,即没有 [a-zA-Z0-9_] )而不是 [!@#$%\^*() _\-+=[{]};:|\./]

标签: regex


【解决方案1】:

试试:

^(?=.*(\d|\W)).{5,20}$

简短说明:

^                         # match the beginning of the input
(?=                       # start positive look ahead
  .*                      #   match any character except line breaks and repeat it zero or more times
  (                       #   start capture group 1
    \d                    #     match a digit: [0-9]
    |                     #     OR
    \W                    #     match a non-word character: [^\w]
  )                       #   end capture group 1
)                         # end positive look ahead
.{5,20}                   # match any character except line breaks and repeat it between 5 and 20 times
$                         # match the end of the input

【讨论】:

  • 不怕……不需要你有数字或非字母数字字符
  • 是的。我猜你没有正确测试它?前瞻要求字符串至少包含一位数字或非单词。
  • ... 如果您的意思是 "a number and non-alphanumeric character",那么这将解决问题:^(?=.*\d)(?=.*\W).{5,20}$
【解决方案2】:

也许这对你有用:

^.*[\d\W]+.*$

并使用类似这样的代码来检查字符串大小:

if(str.len >= 5 && str.len =< 20 && regex.ismatch(str, "^.*[\d\W]+.*$")) { ... }

【讨论】:

  • 我需要在一个正则表达式中解决我当前的问题。
【解决方案3】:

真的有必要把所有东西都塞进一个巨大的正则表达式吗?只需使用程序逻辑(5 ≤ length(s) ≤ 20) ∧ (/[[:digit:]]/ ∨ /[^[:alpha:]]/)。我认为在语法和语义上更具可读性。

【讨论】:

  • 我到处都在使用 ASP.NET 成员资格,需要返回并在多个地方实现该逻辑以及异常等。在成员资格配置中使用正则表达式更容易。正则表达式就像所有其他编程技术一样有它的位置。
【解决方案4】:

非常简单的解决方案,一旦 S.Mark 让我走上正轨,只需要将我的数字和非字母数字部分合并为一个。

这里是任何有兴趣的人的最终正则表达式:

^(?=.*[\d!@#$%\^*()_\-+=\[{\]};:|\./])(?=.*[a-z]).{5,20}$

这将允许 5 到 20 个字符之间的任何密码,并且至少需要一个字母和一个数字和/或一个非字母数字字符。

【讨论】:

    【解决方案5】:

    这样怎么样?

    ^.*?[\d!@#$%\^*()_\-+=\[{\]};:|\./].*$
    

    5,20的长度请使用普通的strlen函数

    【讨论】:

    • 这实际上是行不通的,就好像你想要一个非字母数字或数字字符在开头或结尾一样,它会失败。不过,你确实让我走上了正轨。
    • 你真的测试过吗?它也应该适用于开头或结尾的非字母数字或数字字符。
    猜你喜欢
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2014-05-12
    • 1970-01-01
    • 2016-12-14
    • 2018-01-07
    • 1970-01-01
    相关资源
    最近更新 更多