使用正则表达式从String中提取名称和电子邮件地址

时间:2011-10-26 05:53:36

标签: java regex

我一直在尝试从以下字符串中提取名称和电子邮件地址,该字符串由Java中的正则表达式组成的多行:

From: Kane Smith <Kane@smith.com>
To: John Smith <john@smith.com>, Janes Smith
    <jane@smith.org>, Tom Barter <tom@test.co.uk>, Other
    Weird @#$@<>#^Names <other@names.me>, 
    Long Long Long Long Name <longlong@name.com>
Date: Tue, 25 Oct 2011 15:45:59 +0000

我试过这个正则表达式:To:\s?(([.*]+)\s*<([\w\d@\.]*)>,(\s|\n)*)+ 但它不起作用。

我的目的是提取每个名称和电子邮件地址,并将每个名称的电子邮件地址放在一起。然而,我所做的只有在有一个单一的名称和地址时才能起作用。我的正则表达式应该做什么?

2 个答案:

答案 0 :(得分:3)

    String s = "To: John Smith <john@smith.com>, Janes Smith\n"
            + "<jane@smith.org>, Tom Barter <tom@test.co.uk>, Other \n"
            + "Weird @#$@<>#^Names <other@names.me>, \n"
            + "Long Long Long Long Name <longlong@name.com>";
    s = s.substring(3); // filter TO:
    System.out.println(s);
    // Use DOTALL pattern  
    Pattern p = Pattern.compile("(.*?)<([^>]+)>\\s*,?",Pattern.DOTALL);

    Matcher m = p.matcher(s);

    while(m.find()) {
        // filter newline
        String name = m.group(1).replaceAll("[\\n\\r]+", ""); 
        String email = m.group(2).replaceAll("[\\n\\r]+", "");
        System.out.println(name + " -> " + email);
    }

答案 1 :(得分:1)

您可以在“,”上拆分每一行,然后使用javax.mail.internet.InternetAddress。这将负责提取名称和地址。

顺便说一下,你从哪里得到标题,为什么它们不能成为关键值呢?