-1

我必须验证密码才能满足这些规则

A) 密码必须包含以下 4 个类别中的 3 个字符:

  1. 英文大写字母 A、B、C、... Z
  2. 英文小写字母 a, b, c, ... z
  3. 西化阿拉伯数字 0, 1, 2, ... 9
  4. 非字母数字(“特殊字符”) 例如,标点符号、符号。{},.<>;:'?/|`~!@#$%^&*()_-+= 空格

B) 密码长度必须至少为 8 个字符;

这可以在单个正则表达式中完成吗?那个正则表达式是什么?

4

4 回答 4

5

此任务不适合使用正则表达式。

可以在正则表达式中完成,但它会非常复杂和复杂,你最好以其他方式进行检查。

仅仅因为可以用正则表达式完成某些事情并不意味着这是一个好主意。

于 2013-08-30T10:01:37.487 回答
0

我认为使用复杂的正则表达式不是不惜一切代价使用的方法。在这种情况下,使用带有四个布尔值的简单方法会更容易编写、更容易阅读并且可能也更快。

于 2013-08-30T10:03:11.550 回答
0

你可以检查它是:

  • 不是纯粹的数字和字母数字(这比你的条件说的更激进);
  • 不是纯粹的小写字母和特殊字符

一个单一的正则表达式来检查这将是这样的

(?![A-Za-z0-9]+$|[a-z{},.<>;:'?/|`~!@#$%^&*()_-+= -]+$).{8,}

我故意忽略了您的确切规格。特别是,我不想允许Pass1234,而且我认为设置最大长度没有意义,而且我根本没有限制允许的字符集(即有最低要求,但你可以疯狂和如果您愿意,可以使用控制字符或重音字符)。如果您不同意,这些事情很容易解决。

要严格执行您的规范,您可以检查密码是否不包含纯粹的任何两组;所以不是所有的大写和小写,也不是所有的小写和数字,不是所有的大写和数字,不是所有的数字和特殊字符,不是所有的小写和特殊字符,也不是所有的大写和特殊字符,但同样,这有点乏味恕我直言,适得其反。

您不是在说您使用的是哪种正则表达式风格。我假设您可以使用 Perl 负前瞻(?!...)。如果您受限于传统的 BRE 或 ERE 语法,这将更加困难。

于 2013-08-30T10:30:47.753 回答
-1

我认为您已经使用单个正则表达式获得了非常接近的结果。这是一个例子:

^((?=.*[!@#$%&,()_=/\.\-\*\+\?])[A-Za-z0-9!@#$%&,()_ =/\.\-\*\+\?]{8,20})$

这说:

  • 至少 1 个控制字符
  • 可以包含字母数字字符
  • 长度在 8 到 20 个字符之间
于 2013-08-30T10:05:00.963 回答