在大文本中找到某种模式的有效方法是什么?

时间:2010-05-12 06:03:38

标签: regex text

我想从大文本文件中提取电子邮件地址。最好的方法是什么?

我的想法是在文本中找到'@',并使用“正则表达式”在此位置和长度512之前的(例如)256个字符中查找子字符串中的电子邮件地址。

P.S。:直截了当地我想知道在巨大的文本中找到一些模式(如电子邮件地址)的最佳和最有效的方法。

4 个答案:

答案 0 :(得分:1)

256和512听起来像任意值。

  • 你确实可以扫描@符号, 但是你必须向前看 然后向后直到遇到一个 一个不允许的字符 电子邮件地址(例如,另一个@ 标志,空白,反斜杠...)
  • 引用维基百科:
  

电子邮件地址的本地部分   最长可达64个字符   域名最多可以包含   255个字符。

所以那些价值会更好。

现在结合两种方法和瞧,你有算法。

答案 1 :(得分:1)

这取决于你想要多少误报和漏报。电子邮件地址往往由字母,数字和某些符号组成。但是,虽然在真实的电子邮件地址中看到该字符集中的字符可能极为罕见,但标准为certainly allows it。所以你真的需要决定你想要多少真正的匹配项以及你想要的匹配正则表达式的匹配项,但实际上并不是电子邮件地址。

以下一个答案排除了许多有效案例,也可能包含太多案例:

[A-Za-z0-9!#$%&*+-=?^_~]{1,64}@[A-Za-z0-9-.]{1,255}\.[A-Z]{2,6}

答案 2 :(得分:1)

如果你绝对需要最有效的方法,我认为不应该使用正则表达式。

假设文本中几乎所有@的实例都是电子邮件地址,并且您使用的是快速前进和后退字符串遍历的语言,则此方法可能接近最快:

  1. 搜索@
  2. 手动比较@之后的每个字符,以确保它们在允许的ASCII范围内
  3. 跟踪在第一个空格或其他有效终止字符之前是否找到了有效域
  4. 再次从@符号搜索,比较每个字符以确保它们属于本地组件的有效字符范围

答案 3 :(得分:0)

找到所有有效的电子邮件地址并非易事,因为电子邮件地址语法的RFC为quite complex。如果您只想找到普通电子邮件地址,可以使用以下内容:

/(?<=^|[\s<(\["'])[a-z][\w.+-]+@[\w-]+(?:\.[\w-]+)+(?=[>)\]"']|$)/gi

这个正则表达式假定:

  • 电子邮件地址以字母开头,仅包含字母数字字符,句号,下划线和连字符(当然还包含一个@)。它允许名称部分中的+
  • 它们用空格,方括号,括号,单/双引号或尖括号括起来

它不会检查名称和域部分的长度是否在其允许的范围内(以及RFC设置的许多其他约束)。在示例文件上测试它并查看它匹配的电子邮件数量。