rahul sharma
rahul sharma

Reputation: 149

Password Validation regex android

I need to have following password validations :

  1. At least Min Characters 8 and Maximum Characters 15
  2. At least One Number and 1 special characters from (! @#$%^&*-=+?.);
  3. At least One lower case letter
  4. Password shouldn't be sub strings of username and email (min length 3 and max length 15).
  5. Password should be case sensitive.

I have also looked these answers but I am confuse , should I use Input filters to achieve this or Regex?

Any help will be appreciable. It will be great if you guyz provide a working solution.

Upvotes: 0

Views: 6942

Answers (3)

Eritrean
Eritrean

Reputation: 16498

public class Validation {

    public static void main(String[] args) {  
       String pass = "1AB%CDef555";
       String username = "manna";
       String email = "[email protected]";
       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;        
    }    
}

Upvotes: 4

Mustofa Rizwan
Mustofa Rizwan

Reputation: 10466

You can try this one:

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

Make sure you replace the user and emailaddress by your variable

Explanation

This code works fine for me:

public class NewClass1 {
    public static void main(String[] args) {
        NewClass1 nc = new NewClass1();
        nc.check("abcd123-", "userName", "[email protected]");
        nc.check("userName1-", "userName", "[email protected]");
        nc.check("[email protected]", "userName", "[email protected]");
        nc.check("abcy.c1b", "userName", "[email protected]");
        nc.check("abcd123-", "userName", "[email protected]");
    }

    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");
        }
    }
}

Upvotes: 0

makvasic
makvasic

Reputation: 203

There is great library for that.
It's uses anotations for field and has rich customatization. I think that #4 still needs to be done by hand but you should definitly check out the library.

Here's the example from github:

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

Cheers.

Upvotes: 0

Related Questions