电子邮件地址中提取域名的正则表达式

11

有人能帮我写一个正则表达式,以返回邮件地址中 @ 符号后面的部分吗? 我对正则表达式不太熟悉,但想学习如何使用它而不是编写效率低下的 .Net 字符串函数!

例如,如果输入为“test@example.com”,则需要输出“example.com”。

谢谢! Tim

9个回答

15

正则表达式对于这个目的来说有点过于复杂了。只需在包含电子邮件地址的字符串中使用 @ 字符进行分割,然后取第二部分即可。(电子邮件地址保证只包含一个 @ 字符。)


5
在电子邮件地址验证的所有目的中,一个@符号是分隔符。但是在引用字符串中,如果@符号位于其中,则可以拥有多个@符号,这在技术上讲并不是错误的。参考链接:http://en.wikipedia.org/wiki/Email_address#Syntax - Nate Noonen

14

这将与@进行匹配,然后捕获一直到输入结束的所有内容($)


3
谢谢!我收到了一个 "@example.com" 的值。我能否获取没有 @ 符号的值? - TimS
1
你可能没有得到正确的组。括号 () 表示一个组匹配,所以确保你从索引为1的组中获取结果,而不是0(因为索引#0总是保留给整个表达式匹配)。 - Paul Lammertsma
这是正确的答案,因为OP明确要求一个正则表达式...顺便说一下,这也是我来到这里寻找的 :) - Jens Ehrich

4
这是一个通用的电子邮件匹配器:
[a-zA-Z][\w\.-]*[a-zA-Z0-9]@([a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z])

请注意,它只捕获域组;如果您使用以下内容,则还可以捕获@之前的部分:
([a-zA-Z][\w\.-]*[a-zA-Z0-9])@([a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z])

我不确定这是否符合RFC 2822标准,但我表示怀疑。


3

哇,这里所有的答案都不是很正确。

电子邮件地址可以有任意多个“@”,最后一个并不一定是域名之前的那个 :(

例如,下面是一个有效的电子邮件地址:

user@example.com(i'm a comment (with an @))

虽然这样做可以成为你的电子邮件地址,但你必须非常小心。

首先,需要将结尾处的任何注释解析出来。

然后,

int atIndex = emailAddress.LastIndexOf("@");
String domainPart = emailAddress.Substring(atIndex + 1);

2
您好,以下是您需要翻译的内容:

一个简单的正则表达式:

^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$

但是,当您申请广泛和异构的领域时,它可能没有用处。

例如:

^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)$

但是,您可以根据需要优化后缀域。

但是对于您的后缀需求,您只需要:

@.+$

资源: http://www.regular-expressions.info/email.html


实际上这个正则表达式有点长,可以在这里找到:链接 - xxxxxxx
我推荐这个方案而不是我的,因为它更加灵活。 - Paul Lammertsma
只是不要忘记将域名捕获到一个组中,如下所述:^[A-Z0-9._%+-]+@([A-Z0-9.-]+\.[A-Z]{2,4})$ - Paul Lammertsma
而且,不要忘记转义那些“.”,即使在字符类中也是如此。 - Marc Bollinger

1
$input=hardiksondagar@gmail.com;
// now you want to fetch gmail from input user PHP's inbuilt function 
preg_match('/@(.*)/', $input, $output);
echo $output[1]; // it'll print "gmail.com"
  • 函数文档:preg_match()

2
那个链接与此处发布的问题完全无关不要像这样简单地链接到您的网站,否则您会发现您的帖子被删除为垃圾邮件。我已经为您删除了该链接。 - Andrew Barber
我知道这与问题无关,但链接包含非常棘手的示例,因此我认为对其他人有用...好的,下次我会注意的。谢谢 :-) - Hardik Sondagar

1
尝试使用这个正则表达式:

(?<=([\w-\.]@))((?:[\w]+\.)+)([a-zA-Z]{2,4})

(?<=([\w-.]@))((?:[\w]+.)+)([a-zA-Z]{2,4}) - rajat rastogi

0

0
(@)(\w+\-|\w+)+(\.)

我不是专家,但上述表达式是您需要从电子邮件中获取域的内容,至少在我看来是这样。

问题如指出的那样,您捕获的不仅是域名,还有“@”和“.”。要在正则表达式中访问域名,可以使用“$2”,为了保留“@”和“。”,可以使用以下表达式:

$1newdomain$3

http://www.regexr.com/

上述网站是尝试正则表达式以查看其工作情况的好地方。


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