【问题标题】:Regular expression with Password [duplicate]带密码的正则表达式[重复]
【发布时间】:2013-08-16 09:16:02
【问题描述】:
var pattern = /^[a-zA-Z0-9!@#$%^&*()~]+$/;

var username = document.getelementbyId("txtUsername").value;

if(pattern.test(username) == false) {

    alert("Invalid Username");
}

上述正则表达式模式不起作用。 我想要一个正则表达式,其中密码必须至少包含一个小写字母、一个大写字母、一个数字和一个特殊字符。

【问题讨论】:

  • username,密码?是哪个?
  • 使用 4 个单独的测试。我的建议是将其卸载到单独的函数中以提高可读性。
  • @Kolink 是和否。强制执行最小熵并不是一个坏主意。这里的 OP 试图通过在使用的字母表中强制执行熵来做到这一点。 XKCD 先生是在建议长度维度的熵。任何一个维度都应该被强制执行。理想情况下,您可以根据字母 * 长度计算密码的熵并以这种方式执行。不过,这一切都有些毫无意义。如果攻击者必须预期字母表可能是 a-zA-Z0-9!@#$%^&*(),即使“aaaaaaaa”也是一个很好的密码~.

标签: javascript jquery regex


【解决方案1】:

那么你将不得不进行单独的测试:

if (/[a-z]/.test(username) && /[A-Z]/.test(username) && ...)

您无法在单个正则表达式中合理地表达您的要求。

【讨论】:

  • 是的,我也试过了,但是有点长。单个正则表达式中是否有任何简短版本...?
  • "您无法在单个正则表达式中合理地表达您的要求。"这是可能的,但这将是一个冗长且令人困惑的正则表达式。
  • @Joe I.e. “不合理”... :)
  • @User No. 你必须在你的正则表达式中表达每个可能的排列。如果你指定一组字符,你不知道哪个匹配。所以你必须强制执行个别组:[a-z][A-Z]\d,意思是“一个小写,一个大写,一个数字”。但这也修复了它们出现的顺序,因此您还必须测试 [a-z][A-Z]\d|\d[a-z][A-Z] 和所有其他可能的排列。正则表达式根本不是一次性表达这一点的正确工具。
【解决方案2】:
if (!/[a-z]/.test(username) 
    || !/[A-Z]/.test(username) 
    || !/[0-9]/.test(username) 
    || !/[!@#$%^&*()~]/.test(username)) {
  alert("Invalid");
}

你必须分开支票。

【讨论】:

    猜你喜欢
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多