【问题标题】:Password Validation regex android密码验证正则表达式android
【发布时间】:2016-11-28 08:02:03
【问题描述】:

我需要进行以下密码验证:

  1. 最少 8 个字符,最多 15 个字符
  2. 至少一个数字和 1 个来自 (!@#$%^&*-=+?.) 的特殊字符;
  3. 至少一个小写字母
  4. 密码不应是用户名和电子邮件的子字符串(最小长度为 3,最大长度为 15)。
  5. 密码应区分大小写。

我也看过这些answers,但我很困惑,我应该使用输入过滤器还是正则表达式?

任何帮助都将不胜感激。如果你能提供一个可行的解决方案,那就太好了。

【问题讨论】:

  • 你看了那个答案,你试过了吗?
  • 是的,我试过了,但它没有满足我的全部要求。 @WiktorStribiżew 你能帮我吗?
  • 对不起,我不知道你如何检查 Req. 4 使用正则表达式。
  • @WiktorStribiżew 对休息点的任何帮助预计 4

标签: java android regex string


【解决方案1】:
public class Validation {

    public static void main(String[] args) {  
       String pass = "1AB%CDef555";
       String username = "manna";
       String email = "mannx@rtt.com";
       System.out.println(validiate2(pass, username,email));
    }
    // if you don't care why it fails and only want to know if valid or not 
    public static boolean validiate (String pass, String username, String email){
        String pattern = "^(?=.*[0-9])(?=.*[a-z])(?=.*[!@#$%^&*+=?-]).{8,15}$";
        if(pass.matches(pattern)){
            for(int i=0;(i+3)<username.length();i++){
                if(pass.contains(username.substring(i,i+3)) || username.length()<3 || username.length()>15){
                   return false; 
                }                  
            }
            for(int i=0;(i+3)<email.length();i++){
                if(pass.contains(email.substring(i,i+3)) || email.length()<3 || email.length()>15){
                   return false; 
                }                  
            }
            return true;
        }
        return false;    
    }
    // if you want to know which requirement was not met
    public static boolean validiate2 (String pass, String username, String email){
        if (pass.length() < 8 || pass.length() >15 ){
            System.out.println("pass too short or too long");
            return false;
        }
        if (username.length() < 3 || username.length() >15 ){
            System.out.println("username too short or too long");
            return false;
        }
        if (!pass.matches(".*\\d.*")){
            System.out.println("no digits found");
            return false;
        } 

        if (!pass.matches(".*[a-z].*")) {
            System.out.println("no lowercase letters found");
            return false; 
        }
        if (!pass.matches(".*[!@#$%^&*+=?-].*")) {
            System.out.println("no special chars found");
            return false; 
        } 
        if (containsPartOf(pass,username)) {
            System.out.println("pass contains substring of username");
            return false; 
        }
        if (containsPartOf(pass,email)) {
            System.out.println("pass contains substring of email");
            return false; 
        }
        return true;           
    }

    private static boolean containsPartOf(String pass, String username) {
        int requiredMin = 3
        for(int i=0;(i+requiredMin)<username.length();i++){
            if(pass.contains(username.substring(i,i+requiredMin))){
               return true; 
            }                  
        }
        return false;        
    }    
}

【讨论】:

    【解决方案2】:

    great library
    它使用字段注释并具有丰富的定制化。 我认为#4 仍然需要手工完成,但你应该明确地检查图书馆。

    这是来自 github 的示例:

    @Password(min = 6, scheme = Password.Scheme.ALPHA_NUMERIC_MIXED_CASE_SYMBOLS)
    private EditText passwordEditText;
    

    干杯。

    【讨论】:

    • 感谢@makvasic,但我实际上并不是在寻找一个库来实现这一目标
    【解决方案3】:

    你可以试试这个:

    ^(?!.*(user|emailaddress))(?=.*\d)(?=.*[! @#$%^&*=+?.-])(?=.*[a-z]).{8,15}$
    

    确保用变量替换用户和电子邮件地址

    Explanation

    这段代码对我来说很好用:

    public class NewClass1 {
        public static void main(String[] args) {
            NewClass1 nc = new NewClass1();
            nc.check("abcd123-", "userName", "abc@yahoo.com");
            nc.check("userName1-", "userName", "abc@y.c");
            nc.check("abc@y.c1b", "userName", "abc@y.c");
            nc.check("abcy.c1b", "userName", "abc@y.c");
            nc.check("abcd123-", "userName", "abc@yahoo.com");
        }
    
        public void check(String string, String userName, String email) {
    
            final String regex = "^(?!.*(" + userName + "|" + email + "))(?=.*\\d)(?=.*[! @#$%^&*=+?.-])(?=.*[a-z]).{8,15}$";
            final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
            final Matcher matcher = pattern.matcher(string);
            if (matcher.find()) {
                System.out.println(string + "Full match: " + matcher.group(0));
            } else {
                System.out.println("no match");
            }
        }
    }
    

    【讨论】:

    • @Maverick_Mrt 即使用我的值替换用户|电子邮件地址,它仍然没有完成第四点。
    • @rahulsharma regex101.com/r/pN5mWQ/3 看这里 .. 如果用户名是“用户”或电子邮件地址是“电子邮件”,它不匹配......只需在链接中编辑告诉我如果它是否工作......然后我会查看你的代码
    • @rahulsharma 请查看我更新的答案。有代码 sn-p... 让我知道它是否适合你
    • 亲爱的@maverick_Mrt 不应该是子字符串 min 3 or max 15 character ,您的答案仅在输入“user”或“email”时有效,如果输入“use@1234”则失败,请参阅regex101.com/r/pN5mWQ/3
    • 在您写的原始问题中,至少最小字符 8 和最大字符 15 ...此外,使用我的代码并附加以下行 ... nc.check("use@1234-" , "用户名", "使用@1234");它会说不匹配......它应该说不匹配不是吗?
    猜你喜欢
    • 2011-05-06
    • 2016-10-19
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多