Регулярное выражение для разделения адресов электронной почты (в Java) - PullRequest
1 голос
/ 15 сентября 2009

Я надеюсь, что может быть легкий способ сделать это, я предполагаю регулярные выражения. Каков наилучший способ в Java разделить следующую строку на адреса электронной почты?

bob@home.com, "Jane" <jane@home.com>, "Smith, Mr" <smith@home.com>

Тот факт, что запятая может появляться в двойных кавычках, делает ее несколько более сложной. Я думаю, в идеале это будет работать с одинарными кавычками?

bob@home.com, 'Jane, Ms' <jane@home.com>, "Smith, Mr" <smith@home.com>

Я подумал, что было бы хорошо проверить, есть ли более простой способ, кроме необходимости написать полный анализатор!

Ответы [ 2 ]

5 голосов
/ 15 сентября 2009

Большинство будет обрабатываться:

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

Хотя для полного соответствия требованиям 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])+)\])

Оба из регулярные-выражения.info , с обсуждением того, где оно не соответствует "идеальному".

В Java просто продолжайте повторять, чтобы найти только адреса электронной почты без имен.

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        new Main().findEmails("bob@home.com, \"Jane\" <jane@home.com>, \"Smith, Mr\" <smith@home.com>");
    }
    public void findEmails(String s) {
        System.out.println("ready: "+s);
        Pattern p = Pattern.compile("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b",
                                    Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher(s);
        while (m.find())
            System.out.println("Found: "+m.group());
    }
}
2 голосов
/ 15 сентября 2009

Из ссылки Чедвика, регулярное выражение, правильное для RFC2822:

?.!

(?:[a-z0-9!#$%&'*+/=?^_ {|} ~ -] + (: [а-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])+)\])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...