多行电子邮件地址的正则表达式?

5
我需要一份适用于多行电子邮件地址的正则表达式
例如:

1)单个电子邮件:

johnsmith@email.com  - ok

2) 两行电子邮件:

johnsmith@email.com
karensmith@emailcom  - ok

3) 两行电子邮件:

john  smith@email.com - not ok
karensmith@emailcom

我已经尝试了以下内容:

((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*(\r\n)?)+)\r*

但是当我测试它时,如果像示例3中一样只有1个有效的电子邮件地址,它似乎仍然匹配正确。
我需要一个规则,规定所有电子邮件地址必须有效。

1
构建一个符合RFC语法的正则表达式来正确验证单个电子邮件地址非常困难(大多数实用的正则表达式只能验证语法的子集 - 但这已足够实际使用)。因此最好在空格(和其他可接受的分隔符)上进行拆分,然后独立验证每个地址。这也将使您能够突出显示无效的地址。 - Richard
3个回答

4
如何呢:
^(((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*(\r\n)?\s?)+)*)$

使用'^'检查字符串的开头,并使用'$'检查结尾。

使用'\s?'允许可选的空格字符。

请尝试http://myregexp.com/signedJar.html测试正则表达式。


做了一些快速的初始测试,似乎完成了工作 - 完美! - jaffa
很好。我只检查单个空格字符。如果您在地址之间有更多,请将“\ s?”更改为“\ s *”。 - Mullins
有没有办法使其只接受换行符而不是空格,否则电子邮件可能会在同一行中输入? - jaffa
将单个地址的正则表达式更改为 ^(((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*(\r\n)?\n?)+)*)$,每行一个。 - Mullins

1

我会根据[\r\n]+来分割字符串,并逐个测试每个地址。


0

我猜你可能需要在正则表达式末尾加上多行选项(在大多数情况下,在正则表达式后面加上/m)。

编辑 你可能还想添加锚点\A\z来标记输入数据的开头和结尾。这里有一篇好文章关于锚点。

编辑 Ruby中的快速而简单的示例:

/\A\w+@\w+\.\w+(\n\w+@\w+.\.\w+)*\z/

将会产生:

"test@here.pl\nthe@bar.pl".match(/\A\w+@\w+\.\w+(\n\w+@\w+\.\w+)*\z/)
=> #<MatchData "test@here.pl\nthe@bar.pl" 1:"\nthe@bar.pl">
"test@here.pl\nthebar.pl".match(/\A\w+@\w+\.\w+(\n\w+@\w+\.\w+)*\z/)
=> nil
"test@here.pl".match(/\A\w+@\w+\.\w+(\n\w+@\w+\.\w+)*\z/)
=> #<MatchData "test@here.pl" 1:nil>
"test@here".match(/\A\w+@\w+\.\w+(\n\w+@\w+\.\w+)*\z/)
=> nil

你可以改进正则表达式,这样它就能工作了。关键是要使用\A\z锚点。不需要使用/m修饰符。


对于我的回答,我想补充一点 - 我同意Richard的观点,编写正则表达式来匹配电子邮件地址非常困难(详细解释)。根据语言的不同,最好的方法可能是将输入数据按换行符分割,并逐行检查。 - Miki
尝试了但没有成功,你能提供一个例子吗? - jaffa
看到编辑了,我提供了错误的锚点,是我的错。^$匹配行的开头和结尾,而我应该使用\A\z - Miki

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