有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (3) 个答案

  1. # 1 楼答案

    使用(?=.{10,16})前瞻,您可以设置最小长度10,16并不重要,因为您没有在末尾添加$,告诉您在匹配16个字符后停止匹配

    您可以在{10,16}之后添加$,也可以删除先行项并在最后一个$之前添加{10,16}

    我建议遵循以下规则:lookaheads的数量必须是条件数减1(参见rexegg.com for reference):

    ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).{10,16}$
    ^^^^                                                ^^^^^^^^
    

    See the regex demo

    详细信息

    • ^-字符串的开头
    • (?=.*[0-9])-至少一位数字
    • (?=.*[a-z])-至少一个小写ASCII字母
    • (?=.*[A-Z])-至少一个uppecase ASCII字母
    • (?=.*[!@#$%^&+=])-集合中定义的至少一个特殊字符
    • .{10,16}-任何10到16个字符
    • $-字符串的结尾

    在Java中,如果在.matches()方法中使用模式,则不需要前面的^和后面的$,因为它需要完整的字符串匹配

    爪哇:

    if (s.matches("(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).{10,16}")) {
        return true;
    }
    
  2. # 2 楼答案

    您可以简单地使用正则表达式

    ^[!@#$%^&+=0-9a-zA-Z]{10,16}$
    

    regex 101 demo

    如果您希望密码至少包含[0-9]、[a-z]、[a-z]、!@#$%^&;+=]中的1个,则可以将正则表达式更改为

    ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).{10,16}$
    
  3. # 3 楼答案

    (?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=])(?=.{10,16})
    

    正则表达式的问题是,.*$。您正在匹配0到无限次之间的字符。 除此之外,一切看起来都很完美。我修改了正lookaheads的顺序,因为如果在末尾设置长度限制,则该顺序看起来很好