2

我需要解析出以下字符串的电子邮件地址部分:

“兔子先生” <bob@bunny.com>
<bob@bunny.com>
“bob 是兔子” <bob@bunny.com>
bob@bunny.com
“123 去吧,去吧!” <bob@bunny.com>

在所有情况下,我都在寻找字符串“bob@bunny.com”并且可以忽略其余部分。

我已经尝试了 /"[^"]?"?\s?<?([\w@.]?)>?/ 的各种组合,但发现神奇的模式正在逃避我。

建议?

FWIW 这将在 Perl 中运行。

4

2 回答 2

0

如果一个简单的正则表达式可以,那么您可以使用:

([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,4})

正如@Peter 提到的,如果您想遵守 RFC 2822,它会变得更加复杂。但是,实际上您可能不想完全遵守,因为 RFC 指定使用过时的双引号和括号,甚至不支持通过一些电子邮件应用程序。一个更实用但仍然相当健壮的示例是这样的:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
于 2012-05-11T21:12:26.333 回答
0

如果你想要一个遵守 RFC 2822 的,那么将它翻译成 Regex 语法就是你想要的:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

来自http://www.regular-expressions.info/email.html,其中包含其他更小的表达式。

于 2012-05-11T21:06:06.850 回答