用于拆分电子邮件地址的正则表达式(用Java表示)

时间:2009-09-15 01:06:01

标签: java email

我希望有一种简单的方法可以做到这一点,我假设正则表达式。什么是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 个答案:

答案 0 :(得分:5)

大部分将由以下人员处理:

\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])+)\])

两者都来自regular-expressions.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());
    }
}

答案 1 :(得分:2)

来自Chadwick的链接,正确的RFC2822的正则表达式:

(?:[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])+)\])