Regex найти адрес электронной почты из строки
Я намерен получить адрес электронной почты с веб-страницы. У меня есть источник страницы. Я читаю исходный текст страницы за строкой. Теперь я хочу получить адрес электронной почты из текущей строки, которую я читаю. Эта текущая строка может содержать или не иметь электронную почту. Я видел много примеров регулярных выражений. Но большинство из них предназначены для проверки адреса электронной почты. Я хочу, чтобы адрес электронной почты из источника страницы не проверялся. Он должен работать, поскольку http://emailx.discoveryvip.com/ работает
Некоторые строки ввода примеров:
1)<p>Send details to <a href="mailto:%72%65%62%65%6b%61%[email protected]%68%61%63%6b%73%75%72%66%65%72.%63%6f%6d">[email protected]</a></p>
2)<p>Interested should send details directly to <a href="#" onclick="location.href='http://www.abcdef.com/abcdef/'; return false;">www.abcdef.com/abcdef/</a>. Should you have any questions, please email <a href="mailto:%6a%6f%62%[email protected]%72%65%6c%61%79.%65%64%75">[email protected]</a>.
3)Note :- Send your queries at [email protected] for more details call Mr. neeraj 012345678901.
Я хочу получить [email protected] из примеров 1,2 и 3.
Я использую java, и я плохо разбираюсь в rexexp. Помоги мне.
Ответы
Ответ 1
Вы можете проверить форматы адресов электронной почты в соответствии с RFC 2822, при этом:
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
и здесь объяснение из regular-expressions.info:
Это регулярное выражение состоит из двух частей: части перед @и части после @. Есть две альтернативы для части перед @: она может состоять из серии букв, цифр и определенных символов, включая одну или несколько точек. Однако точки не могут появляться последовательно или в начале или в конце адреса электронной почты. Другая альтернатива требует, чтобы часть до @была заключена в двойные кавычки, позволяя любую строку символов ASCII между кавычками. Пробельные символы, двойные кавычки и обратные косые черты должны быть экранированы обратными косыми чертами.
И вы можете проверить это здесь: Пример Rubular.
Ответ 2
Правильный код
Pattern p = Pattern.compile("\\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}\\b",
Pattern.CASE_INSENSITIVE);
Matcher matcher = p.matcher(input);
Set<String> emails = new HashSet<String>();
while(matcher.find()) {
emails.add(matcher.group());
}
Это даст список почтового адреса в вашем длинном текстовом/html-входе.
Ответ 3
Вам нужно что-то вроде этого регулярного выражения:
".*(\\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}\\b).*"
Когда это совпадет, вы можете извлечь первую группу, и это будет ваш адрес электронной почты.
String regex = ".*(\\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}\\b).*";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("your text here");
if (m.matches()) {
String email = m.group(1);
//do somethinfg with your email
}
Ответ 4
Это простой способ извлечь все письма из строки ввода, используя Patterns.EMAIL_ADDRESS
:
public static List<String> getEmails(@NonNull String input) {
List<String> emails = new ArrayList<>();
Matcher matcher = Patterns.EMAIL_ADDRESS.matcher(input);
while (matcher.find()) {
int matchStart = matcher.start(0);
int matchEnd = matcher.end(0);
emails.add(input.substring(matchStart, matchEnd));
}
return emails;
}