Шаблон регулярных выражений выдает 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}" +
")+"
);
Таким образом, вы можете изменить это в соответствии с вашими потребностями.
Я считаю, что вы должны использовать шаблон, подобный этому:
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();
}