Шаблон регулярных выражений выдает ANR на Android

Я разрабатываю приложение для Android с проверкой электронной почты, для чего я использую Regex, который прилагается ниже:

Это работает в определенных условиях, но для определенных условий, это дает мне App Not Responding ошибки.

Например, если я добавлю текст определенной длины, но не @, то это дает мне ANR. Если длина моей электронной почты ниже этого диапазона, это дает мне правильную ошибку проверки. Мое регулярное выражение выглядит так:

 public static final String EMAIL_PATTERN ="(?:[A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]*)+(\\w[A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+)@(?:[A-Za-z0-9-.]*)";

// Here it gives proper validation error  for fgefjkbgjerk.com but gives ANR 
   for 
   sjkfghhrghergfhfgfghkfgkfgkjkgergejkgrjekfghfghfg.com 

public static boolean checkEmailValidations(String regex,String email){
    boolean patternStatus=false;
    Pattern pattern= Pattern.compile(regex);
    Matcher matcher = pattern.matcher(email);
    if( matcher.matches()){
        patternStatus=false;
    }else{
        patternStatus=true;
    }
    return patternStatus;
}

Есть ли проблема с Regex или моей реализацией?

2 ответа

Если вы просто хотите проверить электронную почту, вы можете использовать шаблоны Android

private boolean isValidEmail(String email) {
    Pattern pattern = Patterns.EMAIL_ADDRESS;
    return pattern.matcher(email).matches();
}

Шаблон, который они используют -

    public static final Pattern EMAIL_ADDRESS        
= Pattern.compile(            
           "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" + 
           "\\@" + 
           "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" + 
           "(" + "\\." +
           "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" + 
           ")+" 
       );

Таким образом, вы можете изменить это в соответствии с вашими потребностями.

См. Здесь и шаблон электронной почты Android

Я считаю, что вы должны использовать шаблон, подобный этому:

public static final Pattern  EMAIL_PATTERN = 
Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);

И если вы не уверены в своем Matcher, я всегда использую этот шаблон:

 public static boolean checkEmailValidations(String email) {
            Matcher matcher = EMAIL_PATTERN .matcher(email);
            return matcher.find();
}
Другие вопросы по тегам