为什么有这么多不同的正则表达式方言?

时间:2010-02-19 16:44:56

标签: regex

我想知道为什么必须有这么多正则表达方言。为什么它看起来像这么多语言,而不是重复使用一种经过验证的方言,似乎一心要写自己的语言。

Like these.

我的意思是,我知道其中一些确实有非常不同的后端。但不应该从程序员那里抽象出来吗?

我更多地指的是奇怪但小的差异,比如括号必须用一种语言转义,但是在另一种语言中是文字。或者元字符意味着有些不同的东西。

有没有什么特别的原因我们不能为正则表达式提供某种通用方言?我认为这对于那些必须使用多种语言的程序员来说会更容易。

4 个答案:

答案 0 :(得分:10)

因为正则表达式只有三个操作:

  • 连接
  • 联盟|
  • Kleene关闭*

其他所有内容都是扩展或语法糖,因此没有标准化的来源。捕获组,反向引用,字符类,基数操作等等都是正则表达式原始定义的补充。

其中一些扩展使“正则表达式”不再具有规律性。由于这些额外内容,他们能够决定非常规语言,但无论如何我们仍称它们为正则表达式。

随着人们添加更多扩展程序,他们通常会尝试使用正则表达式的其他常见变体。这就是为什么几乎每种方言都使用X+来表示“一个或多个X”,这本身只是写XX*的捷径。

但是当添加新功能时,没有标准化的基础,所以有人必须做出一些改进。如果不止一组设计师在同一时间提出类似的想法,他们会有不同的方言。

答案 1 :(得分:3)

出于同样的原因,我们有这么多语言。有些人会试图改进他们的工具,同时其他人会抵制变革。 C / C ++ / Java / C#everyone?

答案 2 :(得分:1)

“我做得更好”编程综合症产生了所有这些东西。它与标准相同。人们试图制定下一个“最佳”标准来取代所有其他标准,它只是成为我们所有人必须学习/设计的东西。

答案 3 :(得分:1)

我认为很重要的一个问题是谁将负责设置和维护标准语法并确保在不同环境中的兼容性?

此外,如果一个正则表达式本身必须在解释器/编译器中使用它自己关于字符串操作的独特规则进行解析,那么这可能导致需要对转义和文字做不同的事情。

一个好的策略是花时间了解正则表达式算法本身如何在更抽象的层次上运行,然后实现任何特定语法变得更加容易。类似于每种编程语言如何具有条件语句和循环等构造的自己的语法,但仍然完成相同的抽象任务。