【问题标题】:What is the efficient way to find some pattern in a big text?在大文本中找到某种模式的有效方法是什么?
【发布时间】:2010-05-12 06:03:38
【问题描述】:

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

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

P.S.:坦率地说,我想知道在 巨大 文本中找到某些模式(如电子邮件地址)的最佳和最有效的方法。

【问题讨论】:

标签: regex text


【解决方案1】:

256 和 512 听起来像是任意值。

  • 您确实可以扫描@符号, 但是你必须向前阅读 并向后退,直到遇到 不允许出现的字符 电子邮件地址(例如,另一个 @ 符号、空格、反斜杠...)
  • 引用维基百科:

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

所以这些值会更好。

现在结合这两种方法,瞧,你就有了你的算法。

【讨论】:

  • 电子邮件地址 in toto 的最大长度也为 254 字节,如 RFC5321 中所述。 (这是 256,包括 <> - tools.ietf.org/html/rfc5321#section-4.5.3.1.3
  • 感谢您的报价。 64 和 256 比 256 和 512 好:)
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢,但我知道使用正则表达式。我的问题是关于在大量文本中查找电子邮件地址,而不是关于电子邮件验证正则表达式。
  • Salman,对我来说这听起来有点矛盾:正则表达式 一种在正文中查找电子邮件地址的方法。可能是也可能不是最好的方法,但是如果它们至少不是“足够好”,那么您谈论的是一个非常罕见的用例。
  • @Tomislav,坦率地说,我想知道在大文本中找到某些模式(如电子邮件地址)的最佳和最有效的方法。
  • “最好和最有效的方法”在很大程度上取决于您正在解析的文本的性质以及您期望找到的地址的性质。如果您真的想将其从 CPU 中挤出(假设它不受 I/O 限制),您可以阅读可管理块中的文本,查找“@”符号并在其后查找第一个非电子邮件地址字符。您不必在“@”之前查找第一个非电子邮件地址字符,因为您已经存储了它的位置,对吧? ;)
  • @Tomislav:到达@ 时,不一定知道第一个非电子邮件地址字符。如果是这样,这将意味着检查@ 之前的每个字符以查看它是否有效。如果文本中电子邮件地址的密度较低,则此检查可能会减慢该过程。正如您所说,解决方案实际上取决于找到的电子邮件地址的性质和正在解析的文本。
【解决方案3】:

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

假设您的文本中几乎所有@ 实例都是电子邮件地址,并且您正在使用一种具有快进和快退字符串遍历的语言,这种方法可能会接近最快:

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

【讨论】:

    【解决方案4】:

    找到所有有效的电子邮件地址并不是一件容易的事,因为电子邮件地址语法的 RFC 是 quite complex。如果您只想定位 普通 电子邮件地址,您可以使用类似:

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

    这个正则表达式假定:

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

    它不检查名称和域部分的长度是否在其允许范围内(以及 RFC 设置的许多其他限制)。在一个示例文件上对其进行测试,看看它匹配了多少封电子邮件。

    【讨论】:

    • 谢谢,但我知道使用正则表达式。我的问题是关于在大量文本中查找电子邮件地址,而不是关于电子邮件验证正则表达式。
    • @salman 从文件中读取一组字符(由换行符分隔,或者如果您的文本是一个大行,则由空格分隔),并针对您喜欢的任何正则表达式测试每个字符集.这很简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2011-12-06
    • 1970-01-01
    相关资源
    最近更新 更多