1

我们希望允许人们将电子邮件地址粘贴到我们的应用程序中的几种不同格式,它们是:

1. foo@bar.com
2. "Foo Bar" <foo@bar.com>
3. Foo Bar <foo@bar.com>

是否有一个好的 Javascript 正则表达式可以采用这 3 个中的任何一个并给出电子邮件地址以及主要名称(如果存在)?这些似乎是用户当前复制/粘贴到应用程序中的格式(我们现在只支持第一个)。

4

3 回答 3

3

我想我可能得到了什么!它肯定可以改进,但在你开始建议更改之前,请给我一点时间来捍卫它。这是正则表达式:

/^(?:("{0,1})(\w+ \w+)\1 <([^@ ]+@[^@ ]+\.[^@. ]+)>|([^@ ]+@[^@ ]+\.[^@. ]+))$/

让我解释一下它的作用。第一个^(?:表示文本必须从字段的开头开始,并且不会在反向引用中捕获下一组。然后我们开始一个可选项目。必须这样做,因为我们需要 0 或 2"以及 0 或 2<标记。可选项目的第一部分(|栏之前)处理案例 2 和 3。

案例 2 和 3:

("{0,1})捕获开头是否有引号。然后我们使用(\w+ \w+)来要求名字和第二个名字,用空格分隔,在案例 2 和 3 中。它们周围的括号将它们捕获到反向引用中,以便您稍后可以获取名称的值。然后是\1- 这是前面引号中的反向引用。它说如果您在名称的开头使用引号,则您也必须在名称的末尾使用它们。接下来,<表示情况 2 和 3 中的电子邮件地址必须用空格与名称或结束引号分隔,并且必须以小于号开头。最后,我们有了电子邮件的正则表达式!这对所有情况都是一样的。它被括号包围以创建反向引用。这[^@ ]+@确保它在实际 @ 符号之前不能有 @ 符号或空格。以下[^@ ]+\.对 @ 符号后的句点执行相同操作,尾随[^@. ]+确保句点后也是如此。然后我们有一个右括号来结束对电子邮件地址的反向引用,还有一个>符号,因为这仍然适用于需要一个的情况 2 和 3。

情况1:

然后我们到达|管道,它表明我们已经到达了正则表达式中的另一个选项。如果文本格式与案例 2 和案例 3 的打开条件不匹配,则正则表达式会检查它是否只是一个普通的电子邮件地址(案例 1)。此处的正则表达式与情况 2 和 3 中符号之间的正则表达式相同<>- 它匹配有效的电子邮件地址并创建反向引用。

有效格式:

Here's an incomplete list of formats that work:

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>

WORKING DEMO

于 2012-08-17T02:44:17.593 回答
1

我建议将电子邮件验证简化为此正则表达式:

/^(?:([^<]*)<)?([^@]+@[^.@]+\.[^@>]+)>?$/

还要检查这个非常好的代码谷歌项目来验证电子邮件:http ://code.google.com/p/isemail/

上述正则表达式的现场演示

于 2012-08-17T01:43:39.100 回答
0

这个正则表达式应该在这 3 种情况下抓取电子邮件:

/<?(\w+@\w+\.\w+)/
于 2012-08-17T01:39:44.360 回答