什么是正则表达式在理论上足够强大?

时间:2011-07-15 21:08:56

标签: regex computer-science

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

我是一名自学成才的程序员,所以从理论的角度来看,我对语言知之甚少。实际上,正则表达式总能成功解析的语言或语法示例是什么?

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

4 个答案:

答案 0 :(得分:3)

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

n打开括号后跟n近括号,例如: (())和((((()))))

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

所以我认为你可以解析基本的SQL(尽管如果你不允许像子查询这样的东西)。正则表达式可解析字符串的其他主要示例是网址,电子邮件地址,电子邮件等。

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

答案 1 :(得分:0)

我已广泛使用正则表达式进行报表处理。 PERL背后的(实用提取和报告语言)已被广泛用于解析来自* nix系统的报告。几十年来,我已经广泛使用了AWK(几乎与正则表达式语言一样接近)来解析日志,报告等。

与任何其他计算机语言/功能一样,正则表达式是工具箱中的工具。它可以解析HTML,它可以解析SQL,但是它的级别以及正则表达式编码的程度如何。没有任何工具是完美的,但如果你使用合适的工具来完成正确的工作,你将总是拥有大量的工具。

答案 2 :(得分:0)

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

您仍然可以使用regexp解析HTML,但是您无法获得树中元素的当前路径等内容。

答案 3 :(得分:0)

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

它们不适合解析像html或sql这样的语言,但它们可用于将语言拆分为相关的令牌。

正则表达式经常被滥用,并且因难以使用和理解而闻名。很多这种声誉都很好,但不是全部。

将它们用于简单案例。在简单的情况下让他们感到舒服,更复杂的情况会更有意义。跑步前走路。