У меня есть строка, включая электронную почту. Вероятно, есть дополнительные символы до и/или после него. примеры ввода:
[email protected]
[email protected] abcd efg
x y z [email protected]
p q [email protected] x z
asd[[email protected]]gh
Я хочу удалить лишние символы.
Требуемые выходы:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
Допустимыми символами являются a-zA-Z0-9._ Таким образом, вероятно, недопустимые символы до и/или после электронной почты.
Я пробовал этот код, чтобы определить, является ли он правильным письмом или нет (предполагается, что он отделен от лишних символов пробелом), но я не могу заменить нужную строку (используя s.replaceAll()):
if (s.matches("(?i).*\\s[a-zA-Z_\\.]+@[a-zA-Z_\\.]+\\.[a-zA-Z_\\.]+.*") ||
fields[2].matches("(?i).*[a-zA-Z_\\.]+@[a-zA-Z_\\.]+\\.[a-zA-Z_\\.]+\\s.*"))
вы можете использовать java.util.regex.Pattern и java.util.regex.Matcher
Этот код будет делать то, что вы просите:
public static void main(String[] args) {
String[] testList = {"[email protected]",
"[email protected] abcd efg",
"x y z [email protected]",
"p q [email protected] x z",
"asd[[email protected]]gh"};
Pattern EMAIL_PATTERN = Pattern.compile("[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})");
for(String test : testList){
Matcher m = EMAIL_PATTERN.matcher(test);
while (m.find()) {
System.out.println(m.group(0));
}
}
}
Проверка адресов электронной почты невозможна. Это возможно только для проверки адреса электронной почты-адресата - и даже эта задача довольно сложная, из-за новых tld с более чем 3-мя символами.
Таким образом, вам лучше найти "недействительные" адреса электронной почты (отправка почты не удалась), а затем отсутствие действительного.
использование
([a-zA-Z0-9!#$%&'*+-/=?^_'{|}~.]+\@(?:[a-zA-Z0-9.-]+|\[[0-9.]+\]))
чтобы захватить все, что может быть адресом электронной почты.
([a-zA-Z0-9!#$%&'*+-/=?^_'{|}~.]+\@(?:[a-zA-Z0-9.-]+|\[[0-9.]+\]))
Учитывая ваше определение действительных символов, попробуйте:
^.*?([\w.]+@[\w.]+).*$
и заменить на группу захвата 1
matches
и неreplaceAll
. Вместо этого установитеMatcher
, используйтеfind
(который найдет шаблон в любом месте строки) и используйтеgroup(0)
чтобы вернуть найденную строку. Намного легче будет сказать, чтобы она возвращала совпавшую строку, чем сказать, чтобы она удаляла несопоставленные символы.