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

Yuz*_*uzu 6 regex unix vi vim history

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

/foo[1-9]*  
Run Code Online (Sandbox Code Playgroud)

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

foo[1-9]+  
Run Code Online (Sandbox Code Playgroud)

必须表达为

/foo[1-9]\+  
Run Code Online (Sandbox Code Playgroud)

在vim.有人知道吗?

Shi*_*dim 24

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

为了让答案更加充实,这里是来自edwiki的引用.

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

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

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

  • Ken Thompson ed在1971 ed年写道.实际上是一个重新实现的qed.
  • 肯在他的版本中添加的正则表达式qed实际上是ed.
  • 受到启发ed,1976年William Joy(被称为Bill Joy)写了ex维基百科
  • 1976年,比尔乔伊写vi了一个名为维基百科的行编辑器的视觉模式ex
  • grep受到qed后来特殊用途的启发ed.
  • sed 实现了许多不受Unix上ed支持的qed脚本功能
  • sed影响了设计awk.

所以vi正则表达式是在ed1971年写的.它早在任何其他正则表达式之前.