【问题标题】:Reg expression required for strong password [duplicate]强密码所需的正则表达式[重复]
【发布时间】:2013-03-01 20:52:40
【问题描述】:

任何人都可以用正则表达式来帮助我输入以下密码。

至少包括以下两项:

小写字母
大写字母
一个数字
“特殊字符”(例如 £、$、&、#)

【问题讨论】:

  • 以下至少两个...表示两个小写字母和两个大写字母的密码有效(不带数字等)是否有效?跨度>
  • herehere 甚至here
  • 抱歉,密码应该包含 4 个字符组中的 2 个,即小写字母和数字或大写字母和数字等
  • 正则表达式可能不是这项工作的正确工具。我能想到的最好的正则表达式将是 12 种不同可能性的交替:小写后跟大写,大写后跟小写,小写后跟数字等。你必须定义什么是“特殊字符”。编写一些代码来循环密码的字符并保持每个类的计数会更容易。
  • @JohnBanks 你用的是什么编程语言?

标签: javascript .net regex


【解决方案1】:

以下应该有效:

^(?![a-z]*$|[A-Z]*$|\d*$|[\W_]*$).*$

示例:http://www.rubular.com/r/effCmvehdx

如果整个字符串完全由一个组组成,则开头的否定前瞻将导致失败。

请注意,尽管这符合您的要求,但对于强密码来说,这并不是一个很好的正则表达式。您可能还需要进行长度检查,并且可能需要至少三个组而不是两个。

【讨论】:

  • 嗯..我在这里遗漏了什么吗? 至少包含以下两项...表示abcABCabc123 必须有效。
  • @OscarMederos:是的,他们是。问题出在哪里?
  • 对不起。我正在使用 Rad Software 正则表达式设计器进行测试,但结果不匹配。我用 C# 对其进行了测试并工作了。您能否编辑您的问题,以便我可以删除我的反对票?
【解决方案2】:

正如 Keith Thompson 在评论中所说,我认为单个正则表达式不值得。

下面的代码会做你想做的事,我认为它比单个正则表达式更具可读性、可维护性和更容易证明正确性:

string password = "123abc";
string[] regexes = new[]
    {
        "[a-z]", //any lowercase word
        "[A-Z]", //any uppercase word
        @"\d", //any digit
        @"\W" //special characters (or just [£$&#], adding the characters you want)
    };
bool isValid = regexes.Count(regex => Regex.IsMatch(password, regex)) >= 2; 

【讨论】:

  • 谢谢大家,我创建了一个validationattribute并使用了Oscar的建议。
【解决方案3】:

正如我在评论中所说,正则表达式几乎肯定不是这项工作的正确工具。编写一些迭代密码字符的代码会容易得多,计算每个类中的字符数。

你还没有定义什么是“特殊字符”。我假设它表示除字母或数字以外的任何字符(包括空格和控制字符)。我还假设“字母”仅指英文字母表中的 26 个字母——这意味着像 ñ 这样的非英文字母是一个特殊字符。

举个更简单的例子,正则表达式不太擅长表达“foo and bar in either order”之类的东西;您必须明确指定两个顺序:

 foo.*bar|bar.*foo

在这种情况下,您需要 12 种不同的选择。我认为这是正确的,但我还没有测试过。

[a-z].*[A-Z}|[A-Z].*[a-z}|[a-z].*[0-9]|[0-9].*[a-z]|[a-z].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[a-z]|[A-Z].*[0-9]|[0-9].*[A-Z]|[A-Z].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[A-Z]|[0-9].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[0-9]

这是一个 egrep 风格或 Perl 风格的正则表达式。 grep 默认不识别|;如果您需要 grep 样式的正则表达式,请将每个 | 替换为 \|

如果要求发生变化,例如需要至少 5 类字符中的 3 类,您将需要完全重写正则表达式;你不能只是调整它。

请注意,您的要求仍然允许Aa

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-24
    • 2014-12-20
    • 2021-07-26
    • 2017-07-08
    • 1970-01-01
    • 2017-06-16
    相关资源
    最近更新 更多