Regex найти адрес электронной почты из строки

Я намерен получить адрес электронной почты с веб-страницы. У меня есть источник страницы. Я читаю исходный текст страницы за строкой. Теперь я хочу получить адрес электронной почты из текущей строки, которую я читаю. Эта текущая строка может содержать или не иметь электронную почту. Я видел много примеров регулярных выражений. Но большинство из них предназначены для проверки адреса электронной почты. Я хочу, чтобы адрес электронной почты из источника страницы не проверялся. Он должен работать, поскольку http://emailx.discoveryvip.com/ работает

Некоторые строки ввода примеров:

1)<p>Send details to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;%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="&#109;&#97;&#105;&#108;&#116;&#111;&#58;%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;
    }