如何使用Java正则表达式在Android上验证用户名和密码?

3

我需要以下正则表达式模式来验证用户名和密码:

用户名:

  • 长度为3到25个字符
  • 至少包含一个字符[a-zA-Z]
  • 包含任何字符,如:0-9,a-z,A-Z,_

我使用了以下模式,但是我无法确定如何设置{3,25}(我的测试尚未验证它):

^[a-zA-Z0-9_]*[a-zA-Z][a-zA-Z0-9_]*{3,25}$

密码:

     * ^                 # start-of-string
     * (?=.*[0-9])       # a digit must occur at least once
     * (?=.*[a-z])       # a lower case letter must occur at least once
     * (?=.*[A-Z])       # an upper case letter must occur at least once
     * (?=.*[a-zA-Z])    # any letter upper or lower case
     * (?=.*[@#$%^&+=])  # a special character must occur at least once
     * (?=\\S+$)          # no whitespace allowed in the entire string
     * .{6,}             # anything, at least six places though
     * $                 # end-of-string
     */
    private Pattern VALID_PASSWORD = Pattern.compile("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z])(?=.*[@#$%^&+!?=])(?=\\S+$).{6,}$");

我只需要更改这个模式,以允许特殊字符,但我不想让它们成为必需品。


1
你可以使用与 (?=.{3,25}$) 相同的机制,或者匹配 \S{3,25} - The fourth bird
我需要允许数字,但我想防止用户仅输入数字。因此,任何字母必须至少出现一次大写或小写,并且整个字符串必须在3到25个字符之间。 - Tom3652
1个回答

3

用户名:

从您当前的模式来看,似乎可以使用以下模式验证您的用户名:

^(?=.*[a-zA-Z])\w{3,25}$

请查看在线演示

  • ^ - 开始字符串定位点。
  • (?=.*[a-zA-Z]) - 正向前瞻,匹配除换行符之外的任意字符零次或多次,后跟 [a-zA-Z] 字符类中的一个字母。
  • \w{3,25} - 字符类 [a-zA-Z0-9_] 中的任意字符,最少出现三次,最多出现25次。
  • $ - 结束字符串定位点。

enter image description here


密码:

当你已经检查过至少一个小写字母和一个大写字母时,在当前模式下再次检查任何大小写字母就没有意义了。此外,. 代表任意字符,可以匹配字符类 [@#$%^&+!?=] 中的特殊字符。如果不想要这些是必须的,请勿在正向前瞻中使用它们。相反,可以尝试以下内容:

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

现在唯一强制要求的字符是至少一个数字,至少一个小写字母和至少一个大写字母。请参见在线演示
  • ^ - 开始字符串锚定。
  • (?=.*\d) - 正向先行断言匹配任何非换行符零次或多次,后跟数字。
  • (?=.*[a-z]) - 正向先行断言匹配任何非换行符零次或多次,后跟小写字母。
  • (?=.*[A-Z]) - 正向先行断言匹配任何非换行符零次或多次,后跟大写字母。
  • \S{6,} - 匹配任何非空格字符,长度至少为6个字符。
  • $ - 结束字符串锚定。

enter image description here


感谢解释。\d 是至少一个数字必需吗? 确实可以正常工作,谢谢。 - Tom3652
2
@TommyD,没错。它是[0-9]的简写形式,而\w[a-zA-Z0-9_]的简写形式。 - JvdV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接