【发布时间】:2010-05-12 06:03:38
【问题描述】:
我想从一个大文本文件中提取电子邮件地址。最好的方法是什么?
我的想法是在文本中找到 '@' 并使用“Regex”在该位置之前的 256 个字符和长度为 512 的(例如)子字符串中查找电子邮件地址。
P.S.:坦率地说,我想知道在 巨大 文本中找到某些模式(如电子邮件地址)的最佳和最有效的方法。
【问题讨论】:
我想从一个大文本文件中提取电子邮件地址。最好的方法是什么?
我的想法是在文本中找到 '@' 并使用“Regex”在该位置之前的 256 个字符和长度为 512 的(例如)子字符串中查找电子邮件地址。
P.S.:坦率地说,我想知道在 巨大 文本中找到某些模式(如电子邮件地址)的最佳和最有效的方法。
【问题讨论】:
256 和 512 听起来像是任意值。
电子邮件地址的本地部分 最长可达 64 个字符,并且 域名最多可以有 255 个字符。
所以这些值会更好。
现在结合这两种方法,瞧,你就有了你的算法。
【讨论】:
< 和 > - tools.ietf.org/html/rfc5321#section-4.5.3.1.3)
【讨论】:
@ 时,不一定知道第一个非电子邮件地址字符。如果是这样,这将意味着检查@ 之前的每个字符以查看它是否有效。如果文本中电子邮件地址的密度较低,则此检查可能会减慢该过程。正如您所说,解决方案实际上取决于找到的电子邮件地址的性质和正在解析的文本。
如果你绝对需要最有效的方式,我认为不应该使用正则表达式。
假设您的文本中几乎所有@ 实例都是电子邮件地址,并且您正在使用一种具有快进和快退字符串遍历的语言,这种方法可能会接近最快:
@
@ 之后的每个字符,以确保它们在允许的 ASCII 范围内@ 符号向后搜索,比较每个字符以确保它们在本地组件的有效字符范围内【讨论】:
找到所有有效的电子邮件地址并不是一件容易的事,因为电子邮件地址语法的 RFC 是 quite complex。如果您只想定位 普通 电子邮件地址,您可以使用类似:
/(?<=^|[\s<(\["'])[a-z][\w.+-]+@[\w-]+(?:\.[\w-]+)+(?=[>)\]"']|$)/gi
这个正则表达式假定:
@)。它允许在名称部分使用+。它不检查名称和域部分的长度是否在其允许范围内(以及 RFC 设置的许多其他限制)。在一个示例文件上对其进行测试,看看它匹配了多少封电子邮件。
【讨论】: