【问题标题】:Password regex not working密码正则表达式不起作用
【发布时间】:2014-05-01 06:52:50
【问题描述】:

这是我的密码正则表达式。

((?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{6,20})

当我输入 "cdsafcghiufvcdsfvcdsghfcydsgfcghdysufcdus" 超过 20 个字时,它工作正常 但是当我使用"Akash1AAkash1AAkash1AAkash1AAkash1AAkash1AAkash1AAkash1AAkash1A" 时它不起作用。

仅对于小写或大写,它工作正常,但是当我使用大写、数字和最大长度的小写时,它不起作用。

我几乎尝试了所有方法,但没有成功。

【问题讨论】:

  • 定义“不工作”(它是如何工作的,它应该如何工作以及为什么)。展示你如何使用这个正则表达式也会很有帮助。
  • 请定义以下内容: (1) 明文密码的正确性规则。 (2) “不工作”是什么意思?
  • 您真的在设置密码长度的上限吗?无论如何,您错过了 ^ 和 $
  • @Dave 关于上限的好点,但如果 OP 使用 str.matches(regex) 方法,那么它正在测试 regex 是否匹配整个字符串,因此 ^$ 是多余的。
  • @Akash 请解释一下“工作”和“不工作”是什么意思

标签: java regex


【解决方案1】:

密码正则表达式,现在很有趣。

我为您提交的内容:

^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]).*$

PHP

$re = '/^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+\-=\[\]{};\':"\\|,.<>\/?]).*$/mx'; 
$str = 'nonumbersSOITFAILS\nalllowercasesoitfails\nALLUPPERCASESOITFAILS\n111111111111111111111\n1alllowercasesoitfails\nALLUPPERCASESOITFAILS1\n1Aa%\n1%UPPERCASElowercasenumberandspecialcharacter\n1%UPPERCASElowercase spacetoo\n\n\n'; 

preg_match_all($re, $str, $matches);

JAVASCRIPT

var re = /^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]).*$/gmx; 
var str = 'nonumbersSOITFAILS\nalllowercasesoitfails\nALLUPPERCASESOITFAILS\n111111111111111111111\n1alllowercasesoitfails\nALLUPPERCASESOITFAILS1\n1Aa%\n1%UPPERCASElowercasenumberandspecialcharacter\n1%UPPERCASElowercase spacetoo\n\n\n';
var m;

while ((m = re.exec(str)) != null) {
    if (m.index === re.lastIndex) {
        re.lastIndex++;
    }
    // View your result using the m-variable.
    // eg m[0] etc.
}

Python

textpop-up
import re
p = re.compile(r'^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+\-=\[\]{};\':"\\|,.<>\/?]).*$', re.MULTILINE | re.VERBOSE)
str = "nonumbersSOITFAILS\nalllowercasesoitfails\nALLUPPERCASESOITFAILS\n111111111111111111111\n1alllowercasesoitfails\nALLUPPERCASESOITFAILS1\n1Aa%\n1%UPPERCASElowercasenumberandspecialcharacter\n1%UPPERCASElowercase spacetoo\n\n\n"

re.findAll(p, str)

REGEX101


检查内容:

  • 最少 8 个字符
  • 至少一个数字 (0-9)
  • 至少 1 个小写字母 (a-z)
  • 至少一个大写字母 (A-Z)
  • 至少 1 个特殊字符 (!@#$%^&*()_+-=[]{};':"\|,.>/?)

不排除的内容:

  • 空格(通常允许在密码中使用)
  • 最大字符数(轻松更改)
  • 可能我错过了什么

不检查的内容:

  • 中间的数字或符号
  • 重复字符(不区分大小写)
  • 连续大写字母
  • 连续小写字母
  • 连续的数字
  • 连续字母
  • 序号
  • 顺序符号
  • 字典词
  • 音节

通常在最低级别,假设密码与条件匹配并且其中没有字典单词,使用此regex 将确保大多数密码强度测试人员的中位数 [45-65] 得分,并确保“良好”已提供密码。

回到你的问题

“只有小写或大写的工作正常,但当我使用大写、数字和最大长度的小写时,它不起作用。”

((?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{6,20})
      ^ the extra `\` makes it invalid for any pattern.

如果您的大写和小写字母至少有一个数字,则将其删除。

只有大写或小写或数字不匹配。

目前它将捕获前 20 个字符,但验证无限个字符。在开头和结尾使用str.matches(regex)^$ 字符[分别在第一个和最后一个()之间],它将限制匹配在6到20之间。

作为旁注,您提供的regex不会导致您提到的结果,因此请确保regex 是您将来正在使用的确切结果,因为这是您唯一的方式会得到任何有用的反馈。

【讨论】:

    猜你喜欢
    • 2011-03-01
    • 2012-11-03
    • 2015-11-30
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多