使用正则表达式匹配电子邮件的问题

时间:2010-04-23 08:46:49

标签: java regex

我正在尝试匹配一个电子邮件地址,这是我到目前为止所提出的:

String text = "gandalf_storm@mymail.com"; 
String regex = "(\\w+)@{1}(\\w+){2,}\\.{1}\\w{2,4}";

然而,这适用于以下情况:

  

gandalf_storm@mymail.com
  gandalfstorm@mymail.com
  gandalf2storm@mymail.com

所以它匹配任何一个或多个字母数字字符,它在一个@之前重复,然后是重复至少两次的任何字母数字字符(对于任何域名都是最小字符),后跟一个。(点),后跟任何字母数字字符重复至少2次,最多4次(因为有.us或.mobi等域名。)

但是,此表达式不适用于以下电子邮件:

  

gandalf.storm@mymail.com   gandalf.storm@mydomain.me.uk   gandalf.storm@mysubdomain.mydomain.me.uk   gandalf.storm@mysubdomain.mysubdomain.mydomain.me.uk   等多个子域

  

gandalf.storm@mymail.com   gandalf2storm@mydomain.me.uk   gandalf_storm@mysubdomain.mydomain.me.uk   gandalfstorm@mysubdomain.mysubdomain.mydomain.me.uk

我刚刚开始学习正则表达式,我发现有趣的是试图通过使用正则表达式来解决这些问题..不是部分但是对于每种情况,任何帮助都会非常适合。谢谢

4 个答案:

答案 0 :(得分:2)

这个问题在此之前已经被问了很多次。 Here's why您不想使用正则表达式  解析电子邮件地址。请注意,正则表达式的怪物甚至不会处理评论。

答案 1 :(得分:0)

this question。特别是Good Person的答案。 This article有一些验证电子邮件地址的代码。

答案 2 :(得分:0)

您使用的正则表达式非常严格:

  • 在@之前使用\ w字符类不允许。字符,这解释了为什么gandalf.storm不匹配
  • 在正则表达式的域部分中,您只允许用a分隔两个“单词”。字符,不包括“mysubdomain.mydomain.net”

你应该尝试修复这些以匹配更复杂的例子。

作为旁注,当您想要匹配单个字符时,{1}部分不是必需的。

答案 3 :(得分:0)

在你学习的时候回答你的问题。

你的正则表达式与第一批不匹配的问题部分是因为@之前的部分不允许'。'字符。改为:

 String regex = "([\\w.]+)@(\\w+){2,}\\.\\w{2,4}";

应该允许gandalf.storm@mymail.com,因为[\\w.]+表示组'\ w'(任何字符)或'。'中的任何字符。 (不需要在组的一部分时进行转义,实际上是指一个点)1次或多次

这可能会给你足够的帮助,以便能够自己解决剩下的问题。毕竟这是学习的重点:)

我在http://www.regexplanet.com/simple/index.html测试了这个,它使用java库作为引擎。