在Java中用于拆分电子邮件地址的正则表达式

3

我希望有一种简单的方法来做这件事,我想使用正则表达式。在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>

我想检查是否有更简单的方法来避免编写完整的解析器!
1个回答

6

大部分将由以下处理:

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

以下是与"perfect"不完全匹配的正则表达式,均来自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());
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接