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

时间:2011-06-10 09:20:37

标签: regex

我正在为多行电子邮件地址寻找RegEx。 例如:

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所示。

我需要一条规则,声明所有电子邮件地址必须有效。

3 个答案:

答案 0 :(得分:3)

怎么样:

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

使用'^'检查字符串的开头,使用'$'检查结尾。 允许使用'\ s?'的可选空白字符。

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

答案 1 :(得分:1)

我将字符串拆分为[\r\n]+,然后单独测试每个地址。​​

答案 2 :(得分:0)

我的猜测是你可能需要在regexp结束时使用多行选项(在大多数情况下是{regexp后的/m)。

修改您可能还想添加锚点\A\z来标记输入数据的开头和结尾。锚点上有good article

编辑使用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锚点。 <{1}}修饰符不是必需的。