我们希望允许多种不同格式的人将电子邮件地址粘贴到我们的应用中,即:
1. foo@bar.com
2. "Foo Bar" <foo@bar.com>
3. Foo Bar <foo@bar.com>
是否有一个很好的Javascript正则表达式可以接受这3个中的任何一个并给出电子邮件地址,以及如果它存在的主要名称?这些似乎是用户当前复制/粘贴到应用程序的格式(我们现在只支持第一个)。
答案 0 :(得分:3)
我想我可能有所收获!它肯定可以改进,但在你开始建议改变之前给我一点时间来保护它。这是正则表达式:
/^(?:("{0,1})(\w+ \w+)\1 <([^@ ]+@[^@ ]+\.[^@. ]+)>|([^@ ]+@[^@ ]+\.[^@. ]+))$/
让我解释它的作用。第一个^(?:
表示文本必须从字段的开头开始,并且不会在后向引用中捕获下一个组。然后我们开始一个可选项。必须这样做,因为我们要求0或2 "
,以及0或2 <
标记。可选项的第一部分(在|
栏之前)处理案例2和3.
案例2和3:
("{0,1})
捕获开头是否有引号。然后我们在案例2和3中使用(\w+ \w+)
要求第一个名称和第二个名称(用空格分隔)。它们周围的括号将它们捕获到反向引用中,以便以后可以获取名称的值。然后是\1
- 这是之前引号的反向引用。它说如果你在名称的开头使用引号,你也必须在名称的末尾使用它们。接下来,<
表示案例2和3中的电子邮件地址必须用名称或结束引号之间的空格分隔,并且必须以小于号开头。最后,我们有电子邮件的正则表达式!对于所有情况都是如此。它被括号括起来创建反向引用。 [^@ ]+@
确保它在实际@符号之前不得有@符号或空格。以下[^@ ]+\.
对@符号后面的句点执行相同操作,尾随[^@. ]+
确保在句点后同样为真。然后,我们有一个右括号来结束对电子邮件地址的反向引用,以及一个>
符号,因为这仍然适用于需要一个的情况2和3。
案例1:
然后我们到达|
管道,它指明我们已经到了正则表达式中的另一个选项。如果文本的格式与案例2和3的开放条件不匹配,则正则表达式检查它是否只是一个普通的电子邮件地址(案例1)。这里的正则表达式与情况2和3中<>
符号之间的正则表达式相同 - 它匹配有效的电子邮件地址并创建反向引用。
以下是不完整的格式列表:
foo@bar.com
foo1.foo2@bar.com
foo1.foo2@bar1.bar2.com
Foo Bar <foo@bar.com>
"Foo Bar" <foo@bar.com>
foo bar <site1.site2@test1.test2.com>
"foo bar" <site1.site2@test1.test2.com>
答案 1 :(得分:1)
我建议将电子邮件验证简化为此正则表达式:
/^(?:([^<]*)<)?([^@]+@[^.@]+\.[^@>]+)>?$/
另请查看这个非常好的代码Google项目来验证电子邮件:http://code.google.com/p/isemail/
答案 2 :(得分:0)
这个正则表达式应该抓住这3个案例中的电子邮件:
/<?(\w+@\w+\.\w+)/