【问题标题】:Extracting Names and Email address from String with regex使用正则表达式从字符串中提取名称和电子邮件地址
【发布时间】:2011-12-15 11:51:39
【问题描述】:

我一直在尝试通过 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*&lt;([\w\d@\.]*)&gt;,(\s|\n)*)+ 但它不起作用。

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

【问题讨论】:

    标签: java regex


    【解决方案1】:
        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);
        }
    

    【讨论】:

    • 谢谢!但是因为这实际上来自电子邮件标题,所以我可能无法在此之后执行子字符串然后 replaceAll。我更新了关于搜索字符串的问题,以表明由于 To 上方和 To 下方的内容,还有其他内容。如果 To 不那么干净,我是否仍然可以将它们提取出来?
    • 为什么不使用其他正则表达式获取“TO”内容,然后使用此代码提取电子邮件和姓名?
    • @Fred:如果主题或名称或如果有另一个标题说Delivery-To:,我将获得不止一个搜索“收件人”的内容。
    • 另外,如果名称包含&lt; 字符,则正则表达式也会错误匹配。
    【解决方案2】:

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

    顺便说一句,您从哪里获取标头,为什么它们不能成为应有的键值?

    【讨论】:

    • 内容直接来自POP。我不打算使用 javamail 库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2017-07-13
    • 2011-12-28
    • 2016-04-28
    • 2013-04-09
    • 2016-02-24
    相关资源
    最近更新 更多