регулярное выражение извлечения электронной почты Java?

Мне нужно регулярное выражение, которое будет извлекать адреса электронной почты из строки (используя регулярные выражения Java).

Это действительно работает.


person EugeneP    schedule 12.02.2010    source источник
comment
Адреса электронной почты и регулярное выражение: stackoverflow.com/questions/201323/   -  person Bart Kiers    schedule 12.02.2010
comment
Ага. Но на самом деле валидация — это не всегда то, что нам нужно. Если вы поставите символы S и ^, это не будет работать с произвольным текстом. Надеюсь, мой вопрос и ответ будут полезны и другим.   -  person EugeneP    schedule 12.02.2010
comment
Шаблоны/ответы (многие!) опубликованные в этой ветке, должны предоставить вам более чем достаточно информации, IMO.   -  person Bart Kiers    schedule 12.02.2010


Ответы (5)


Вот регулярное выражение, которое действительно работает. Я провел час в Интернете и тестировал разные подходы, и большинство из них не сработало, хотя Google поставил эти страницы на первое место.

Хочу поделиться с вами работающим регулярным выражением:

[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})

Вот исходная ссылка: http://www.mkyong.com/regular-expressions/how-to-validate-email-address-with-regular-expression/

person EugeneP    schedule 12.02.2010
comment
Извините, это неправильно. Для плюсовой адресации это не удастся (en.wikipedia.org/wiki/E- mail_address#Sub-addressing), среди прочего (например, [email protected]). Написать правильное регулярное выражение для адресов электронной почты /очень/ сложно (если вообще возможно). См. также stackoverflow.com/questions/201323/ - person Matthew Flaschen; 12.02.2010
comment
И не говоря уже о решении ICANN разрешить нелатинские символы в адресах электронной почты: stackoverflow.com/questions/201323/ - person BalusC; 12.02.2010
comment
Ну, вы правы, я не знал, что плюсик может быть частью любого адреса электронной почты. I можно легко добавить между квадратными скобками. Но я почти уверен, что 99,9% людей не используют его, и большинство почтовых серверов не позволяют использовать знак плюс как часть адреса электронной почты. Абсолютно согласен с тем, что могут быть ситуации, когда независимо от того, какое регулярное выражение не будет работать при проверке/извлечении электронной почты. Хотя этот работал для меня, и я видел другие, которые не работали. - person EugeneP; 15.02.2010
comment
Что ж, Google разрешает знак +, поэтому все умные пользователи, у которых есть Gmail, могут это сделать. ;П - person Rihards; 11.06.2011

Мне пришлось добавить несколько тире, чтобы учесть их. Итак, окончательный результат на яванском языке:

final String MAIL_REGEX = "([_A-Za-z0-9-]+)(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})";
person thealy    schedule 28.12.2011

Установите этот подключаемый модуль тестера регулярных выражений в eclipse, и у вас будет уйма времени на тестирование регулярных выражений
http://brosinski.com/regex/.

На заметку:
В плагине используйте только одну обратную косую черту для экранирования символа. Но когда вы транскрибируете регулярное выражение в строку Java/C#, вам придется удвоить их, поскольку вы будете выполнять два escape-последовательности, сначала экранируя обратную косую черту из строкового механизма Java/C#, а затем второй для фактического механизма escape-символа регулярного выражения.

Окружите разделы регулярного выражения, текст которого вы хотите захватить, круглыми скобками/многоточием. Затем вы можете использовать групповые функции в регулярном выражении Java или C#, чтобы узнать значения этих разделов.

([_A-Za-z0-9-]+)(\.[_A-Za-z0-9-]+)@([A-Za-z0-9]+)(\.[A-Za-z0-9]+)

Например, используя приведенное выше регулярное выражение, следующая строка

[email protected]

урожаи

start=0, end=16
Group(0) = [email protected]
Group(1) = abc
Group(2) = .efg
Group(3) = asdf
Group(4) = .cde

Группа 0 — это всегда захват всей совпавшей строки.

Если вы не заключите какой-либо раздел с многоточием, вы сможете только обнаружить совпадение, но не сможете захватить текст.

Создание нескольких регулярных выражений может быть менее запутанным, чем одно длинное универсальное регулярное выражение, поскольку вы можете программно протестировать одно за другим, а затем решить, какие регулярные выражения следует объединить. Особенно, когда вы найдете новый шаблон электронной почты, который вы никогда не рассматривали раньше.

person Blessed Geek    schedule 12.02.2010
comment
@h2g2java Говоря о себе, я уже использую подобный плагин. И я очень ценю ваш ответ, потому что я также считаю, что без таких инструментов работа с регулярными выражениями может быть кошмаром. Я уверен, что ваш ответ поможет многим людям сэкономить свое время. - person EugeneP; 15.02.2010

немного поздно, но ладно.

Вот что я использую. Просто вставьте его в консоль FireBug и запустите. Найдите на веб-странице «текстовое поле» (скорее всего, внизу страницы), которое будет содержать отдельный список всех адресов электронной почты, найденных в тегах A.

    var jquery = document.createElement('script');
    jquery.setAttribute('src', 'http://code.jquery.com/jquery-1.10.1.min.js');
    document.body.appendChild(jquery);

    var list = document.createElement('textarea');
    list.setAttribute('emaillist');
    document.body.appendChild(list);
var lijst = "";

    $("#emaillist").val("");
    $("a").each(function(idx,el){
        var mail = $(el).filter('[href*="@"]').attr("href");
        if(mail){
            lijst += mail.replace("mailto:", "")+",";
        }
    });
    $("#emaillist").val(lijst);
person Digital Human    schedule 03.07.2013

Встроенный в Java шаблон адреса электронной почты (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;
    }
person Duy Pham    schedule 13.10.2017