2016-11-28 3 views
0

мне нужно иметь следующие пароль валидаций:Password Validation регулярное выражение андроида

  1. По крайней мере Минимум символов 8 и Максимальное количество символов 15
  2. По крайней мере, один номер и 1 специальные символы из (@ # $%^&! * - = +?.);
  3. По крайней мере, одна строчная буква
  4. Пароль не должен быть подстрокой имени пользователя и электронной почты (минимальная длина 3 и максимальная длина 15).
  5. Пароль должен быть чувствительным к регистру.

Я также посмотрел эти answers, но я смущаюсь, следует ли использовать фильтры ввода для достижения этого или регулярного выражения?

Любая помощь будет заметна. Будет здорово, если вы создадите рабочее решение.

+0

Вы посмотрели на этот ответ, и вы попробовали? –

+0

Да, я пробовал, но это не соответствует моему полному требованию. @ WiktorStribiżew не могли бы вы помочь мне с этим. –

+0

Извините, я понятия не имею, как вы можете проверить Req. 4 с регулярным выражением. –

ответ

3
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])(?=.*[[email protected]#$%^&*+=?-]).{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(".*[[email protected]#$%^&*+=?-].*")) { 
      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;   
    }  
} 
0

Вы можете попробовать это:

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

Убедитесь, что вы замените пользователя и EmailAddress вашей переменной

Explanation

Этот код отлично работает для меня:

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

Спасибо, я думаю, это сработает, попробуйте. –

+0

Это не соответствует пункту № 4. – Toto

+0

@Maverick_Mrt Даже заменяя пользователя | emailaddress моими значениями, он по-прежнему не завершает 4-ю точку. –

0

Для этого есть great library.
Он использует анотации для поля и имеет богатую настройку. Я думаю, что # 4 все еще нужно делать вручную, но вы должны обязательно проверить библиотеку.

Вот пример из GitHub:

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

Приветствия.

+0

Спасибо @makvasic, но я на самом деле не ищу lib для достижения этого –

Смежные вопросы