Android密码验证

时间:2015-03-23 12:37:49

标签: java android regex

我正在开发一个Android应用程序,我必须验证密码。下面是我用于验证的代码行,但我无法获得所需的验证。

我的要求是:需要解析一个字符串,使得它至少需要一个特殊字符,一个数字和A-Z,a-z中的任何字母..请帮助我获取所需的输出..

public static boolean isAlphaNumericPwd(String name) {
        return name.matches("^[a-zA-Z0-9]*$");
    }

    public static boolean isSpecialPwd(String name) {
        return name.matches("!@#$*()?,.");
    }

1 个答案:

答案 0 :(得分:5)

你的正则表达式不适用于你试图做的事情。首先,我将指出问题,然后在下面我将向您展示您应该做的事情:

"^[a-zA-Z0-9]*$"

以上正则表达式查找整个字符串,其中只存在字母(大写和小写)a-z和/或数字。因为您正在使用开始和结束锚点(^ - 开始锚点,$ - 结束锚点),所以您说ENTIRE密码必须仅包含这些值。由于这些锚点,子字符串不会被视为匹配。

您用于检查特殊字符的正则表达式也不起作用,因为您没有转义保留的正则表达式字符,即使您是这样,也只会在子字符串中查找该顺序中的模式!@#*()?,.

*字符保留为前一个字符(#)的零次或多次出现。字符?保留用于表示前一个字符中的零个或一个,因此您可以检查(可能)或可能不存在。那么。字符表示任何字符。如果你确实想要这个确切的表达式,你需要将其转义为:

"!@#$\*()\?,\."

然而,这仍然无法解决您的问题,因为它会匹配那组字符,按此顺序。

听起来你只想检查是否有字母,至少一个数字,以及至少一个特殊字符。在这种情况下,您不能只使用一个正则表达式...即如果您想使用正则表达式。

public static boolean validatePassword(String pswd) {
    //check that there are letters
    if(!pswd.matches("[a-zA-Z]+"))
        return false;  //nope no letters, stop checking and fail!            
    //check if there are any numbers
    if(!pswd.matches("[0-9]+"))
        return false;  //nope no numbers, stop checking and fail!
    //check any valid special characters
    if(!pswd.matches("[.!#*()?,]+"))
        return false;  //nope no special chars, fail!

    //everything has passed so far, lets return valid
    return true;
}

请注意,在我的示例中,每个表达式都不包含任何锚点。这是因为我们不关心角色在字符串中的位置,只是它们存在。我也没有使用*因为它可能意味着零,而是使用+字符,因为这意味着至少一次。最后请注意,所有这些都放在括号中,这意味着它们是字符类,因此我们需要一个匹配任何这些值的字符。然后+作为一个整体来自角色类,而不是单个角色。此外,在字符类中,您不需要转义(大多数)保留字符,因为它们在该构造中具有不同(或没有)含义。

据说所有人都知道这些密码要求不是很好,但这至少应该指明你如何进行这种验证方法。