【问题标题】:What are regular expressions theoretically strong enough for? [closed]正则表达式在理论上足够强大吗? [关闭]
【发布时间】:2011-07-15 21:08:55
【问题描述】:

如果你问一个关于用正则表达式解析 HTML 的问题,你肯定会参考这个著名的rant。虽然没有规范的咆哮,但我也被告知正则表达式不足以解析 SQL。

我是一名自学成才的程序员,所以从理论的角度来看,我对语言了解不多。实际上,正则表达式总是可以成功解析的语言或语法示例有哪些?

具体来说,我真的想要一些在现实世界中使用的语言示例,这些示例适合常规语言的类别,而不是一些公理或等效条件等。

【问题讨论】:

  • 导致比您最初想要解决的问题更大的问题。
  • @Daniel DiPaolo 根本不是那个问题的副本
  • @FarmBoy 可能重复的关键是“你用什么正则表达式?”这与您所问的问题完全相同 - 如果您不是在寻找正则表达式的用途并且只想询问常规语言/语法,请改写您的标题
  • @ridgerunner,不仅仅是支持递归模式的语言:所有支持反向引用的语言,如:Python、Ruby、Java 等,也属于解析/比常规语言匹配更多。正则表达式 (.)\1 是非常规的。

标签: regex computer-science


【解决方案1】:

正则表达式非常适合解析只有重复的内容。当你有递归形式时,它们会出错。我认为最有用的是显示它无法解析的最简单的语言:

n 左括号后跟 n 右括号,例如: (()) 和 ((((())))))

如果你知道你无法解析它,你可以很容易地得出结论,你无法解析大多数编程语言。

所以我认为您可以解析基本 SQL(但如果您允许子查询之类的东西,则不能)。正则表达式可解析字符串的其他主要示例是网址、电子邮件地址、电话号码等。

如果您正在寻找可以使用正则表达式解析的实际编程语言,您将找不到很多(尽管我认为(根据我对它的有限了解)解析汇编应该是可能的。但是大多数用途都是在解析简单时找到的字符串或行。

【讨论】:

    【解决方案2】:

    我已将正则表达式广泛用于报表处理。 PERL 后缀为(实用提取和报告语言)已被广泛用于解析来自 *nix 系统的报告。几十年来,我广泛使用 AWK(它与您所能获得的仅使用正则表达式的语言一样接近)来解析日志、报告等。

    正则表达式与任何其他计算机语言/功能一样,是工具箱中的工具。它可以解析 HTML,它可以解析 SQL,但正则表达式编码到什么级别以及有多好。没有工具是完美的,但如果你为正确的工作使用正确的工具,你将永远拥有大量可用的工具。

    【讨论】:

      【解决方案3】:

      简而言之,正则表达式无法解析嵌套级别未知的结构(如 HTML)。因为大多数正则表达式引擎都是基于finite state machine。这将您的表达式限制为仅处理预定义数量的状态。

      您仍然可以使用正则表达式解析 HTML,但无法获取树中元素的当前路径等信息。

      【讨论】:

        【解决方案4】:

        它们非常适合输入验证。 它们非常适合解析结构良好的数据文件。

        它们不适合解析 html 或 sql 之类的语言,但它们可用于将语言拆分为相关标记。

        正则表达式经常被误用,并且以难以使用和理解而著称。这种声誉的大部分是来之不易的,但并非全部。

        将它们用于简单的情况。在简单的情况下熟悉它们,更复杂的情况会更有意义。跑之前先走。

        【讨论】:

        • 我知道如何使用它们就好了。我只是想了解常规的含义。
        猜你喜欢
        • 2019-11-23
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        • 2012-04-08
        相关资源
        最近更新 更多