正则表达式从字符串中查找电子邮件地址

Posted

技术标签:

【中文标题】正则表达式从字符串中查找电子邮件地址【英文标题】:regex to find email address from a String 【发布时间】:2013-04-09 20:19:33 【问题描述】:

我的目的是从网页获取电子邮件地址。我有页面源。我正在逐行阅读页面源代码。现在我想从我正在阅读的当前行中获取电子邮件地址。当前行可能有也可能没有电子邮件。我看到了很多正则表达式的例子。但其中大多数是用于验证电子邮件地址。我想从未验证的页面源获取电子邮件地址。它应该像http://emailx.discoveryvip.com/ 一样工作

一些示例输入行是:

1)<p>Send details to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;%72%65%62%65%6b%61%68@%68%61%63%6b%73%75%72%66%65%72.%63%6f%6d">neeraj@yopmail.com</a></p>

2)<p>Interested should send details directly to <a href="http://www.abcdef.com/abcdef/">www.abcdef.com/abcdef/</a>. Should you have any questions, please email <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;%6a%6f%62%73@%72%65%6c%61%79.%65%64%75">neeraj@yopmail.com</a>.

3)Note :- Send your queries at  neeraj@yopmail.com  for more details call Mr. neeraj 012345678901.

我想从示例 1,2 和 3 中获取 neeraj@yopmail.com。 我正在使用java并且我不擅长rexexp。帮我。

【问题讨论】:

你查看谷歌关于“java regex email”的说法了吗? 查看emailx.discoveryvip.com的页面来源。他们已经给出了提取电子邮件的方法。但我想要一个java版本 你试过什么? Stack Overflow 是一个问答网站,而不是“为我工作”网站。向我们展示您有什么,以便我们帮助您解决具体问题。 @Vitaly 是的。相关的是***.com/questions/2250820/…。但它不起作用。 @Neeraj,既然您已经知道如何验证电子邮件,您可以再进一步,捕获匹配的组,组中的数据正是您想要的。 【参考方案1】:

你需要这样的正则表达式:

".*(\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]2,4\\b).*"

当它匹配时,您可以提取第一组,这将是您的电子邮件。

String regex = ".*(\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]2,4\\b).*";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("your text here");
if (m.matches()) 
    String email = m.group(1);
    //do somethinfg with your email

【讨论】:

如何只获取第一个匹配的文本 正则表达式不允许小写字母,除非您使用CASE_INSENSITIVE 编译它。事实上,它不会匹配大多数电子邮件地址。【参考方案2】:

这是一种使用Patterns.EMAIL_ADDRESS从输入字符串中提取所有电子邮件的简单方法:

    public static List<String> getEmails(@NonNull String input) 
        List<String> emails = new ArrayList<>();
        Matcher matcher = Patterns.EMAIL_ADDRESS.matcher(input);
        while (matcher.find()) 
            int matchStart = matcher.start(0);
            int matchEnd = matcher.end(0);
            emails.add(input.substring(matchStart, matchEnd));
        
        return emails;
    

【讨论】:

【参考方案3】:

正确的代码是

Pattern p = Pattern.compile("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]2,4\\b",
    Pattern.CASE_INSENSITIVE);
Matcher matcher = p.matcher(input);
Set<String> emails = new HashSet<String>();
while(matcher.find()) 
  emails.add(matcher.group());

这将在您的长文本/html 输入中给出邮件地址列表。

【讨论】:

这不考虑包含两个以上部分的域名,例如在英国,您的地址类似于 something@company.co.uk。现在还有一堆超过 4 个字符的新 TLD。【参考方案4】:

您可以根据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的解释:

这个正则表达式有两部分:@ 之前的部分和@ 之后的部分。 @ 之前的部分有两种选择:它可以由一系列字母、数字和某些符号组成,包括一个或多个点。但是,圆点可能不会连续出现,也不会出现在电子邮件地址的开头或结尾。另一种选择要求 @ 之前的部分用双引号括起来,允许引号之间的任何 ASCII 字符串。空白字符、双引号和反斜杠必须用反斜杠转义。

您可以在这里查看:Rubular example。

【讨论】:

非常感谢 NomNomBot。我正在尝试使用您的正则表达式。 确保转义正斜杠、反斜杠等

以上是关于正则表达式从字符串中查找电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

在特定子字符串和分号之间查找电子邮件地址

正则表达式

text 正则表达式从字符串中提取电子邮件地址

使用正则表达式python查找电子邮件[重复]

Linux 学习总结(84)—— 回顾下正则表达式

Linux 学习总结(84)—— 回顾下正则表达式