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

cor*_*ras 1 java email

我希望可能有一个简单的方法来做到这一点,我假设正则表达式.什么是java中将以下字符串拆分成电子邮件地址的最佳方式?

bob@home.com, "Jane" <jane@home.com>, "Smith, Mr" <smith@home.com>
Run Code Online (Sandbox Code Playgroud)

逗号可以出现在双引号内的事实使得它更难一些.我觉得理想情况下它也适用于单引号?

bob@home.com, 'Jane, Ms' <jane@home.com>, "Smith, Mr" <smith@home.com>
Run Code Online (Sandbox Code Playgroud)

我认为检查是否有更简单的方法可以节省编写完整的解析器!

Cha*_*ick 6

大多数将由以下人员处理:

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b
Run Code Online (Sandbox Code Playgroud)

虽然完整的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])+)\])
Run Code Online (Sandbox Code Playgroud)

两者都来自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());
    }
}
Run Code Online (Sandbox Code Playgroud)