在vim的正则表达式引擎中,为什么有些元字符会被转义而有些不是?

时间:2012-12-22 00:27:56

标签: regex unix vim history vi

为什么你必须在他们的正则表达式引擎中逃避一些元字符,而不是其他元字符?例如:

/foo[1-9]*  

按预期工作,但正则表达式

foo[1-9]+  

必须表示为

/foo[1-9]\+  

在vim中。有人知道吗?

1 个答案:

答案 0 :(得分:23)

这是因为vim(实际上是 vi )在perl之前很久就创建了自己的正则表达式。甚至POSIX BRE和ERE都来自vim wikipedia 。他们仍然保持自己的味道,所以它是完全不同的。

为了使答案更加充实,这里引用ed's wiki

  

编辑最初是由Ken Thompson在 1971 的PDP-11/20汇编程序中编写的。 ed的许多特征来自他的母校加州大学伯克利分校的{qed 3汤普森非常熟悉qed,并在CTSS和Multics系统上重新实现了它。 他的qed版本是第一个实现正则表达式的虽然正则表达式是ed的一部分,但它们的实现远不如qed中的实现。

     

ed的各个方面继续影响前反过来产生了vi 。非交互式Unix命令grep的灵感来自qed和后来编辑的常见特殊用法,其中命令 g / re / p表示全局搜索正则表达式re并打印包含它的行。 Unix流编辑器,sed实现了许多在Unix上不受ed支持的qed脚本功能。反过来,sed影响了编程语言AWK的设计 - 这启发了Perl的各个方面。

这两段有很多信息!我希望我能大胆一点。一些亮点,

  • Ken Thompson在1971年写了eded实际上是qed的重新演绎。
  • Ken在他的qed版本中添加了正则表达式,实际上是ed
  • ed的启发,1976年William Joy(称为Bill Joy)写了ex wikipedia
  • Bill Joy在1976年写了vi作为名为ex wikipedia
  • 的行编辑器的可视化模式
  • grep受到qed及以后ed的特殊用途的启发。
  • sed实现了许多qed的脚本功能,而Unix上的ed不支持
  • sed影响了awk
  • 的设计

所以vi正则表达式出现在ed中,写于1971年。它早在任何其他正则表达式之前。