为什么VIM有自己的正则表达式语法?

62
为什么要将正则表达式设置为“非常魔法”,以避免转义捕获引号?如果将环境设置为“非常魔法”,则不符合标准且可能存在遵从性问题。我只是想知道,为什么Vim使用与Perl不同的正则表达式语法?

33
为什么我输入“big”这个单词时,只有字母“g”被插入进去? - Dirk Vollmar
1
Visual Studio的查找和替换正则表达式模式也是非标准的,尽管他们在.net中拥有一个完美好用的标准化的正则表达式引擎。你可以从中得到什么启示。 - Blindy
1
@Blindy:这并不是那么简单。当创建VS风格时,.NET正则表达式风格尚不存在。他们本可以像.NET团队一样直接基于Perl语法来定义VS语法,但他们选择保持与早期MS工具的连续性。我并不是在为他们的选择辩护,只是指出这并不是完全愚蠢的决定。 ;) - Alan Moore
1
@Alan Moore:我并没有说VIM是唯一做出这个选择的软件。VS是我最喜欢的软件之一 :) - Blindy
2
我觉得vim的正则表达式很笨重和武断。不得不转义一些运算符\(\)\+但不是其他的^$*[]有点愚蠢。 - Mateen Ulhaq
是的,vim 中另一个愚蠢的问题是非贪婪匹配。在 vim 中,PCRE 中的 a.*?b 将变为 a.\{-}b。现在 PCRE 是行业标准,gvim 中一定有一些工具可以使用 PCRE……甚至可以编译一个新的 vim 来使用 PCRE。 - ihightower
3个回答

75

大多数vi(因此vim)功能均源自ed。 vi和ed的发布时间都比Perl早至少十年或二十年。 一个更好的问题可能是“为什么Perl不使用与vi相同的正则表达式语法?”。

当然,也可以认为,在文本编辑器中希望编写以执行常见任务的正则表达式的类型与在编程语言中想要编写的类型可能非常不同。


46
可以的,但就我个人而言,我认为开发者的思维空间已经过于分散。PCRE 已经成为了一种行业标准。我喜欢 VIM 的其中一个原因就是它有很多选项可供选择。至少应该允许将 PCRE 作为搜索/替换引擎,可以通过 ./configure 标志来实现。 - rossipedia
11
这是一个开源产品。如果这对你来说是一个杀手级特性,为什么不将其实现并提交为补丁呢?也许有其他人也有同样的需求,可以从中受益。 - Gian
2
@Bryan:Vim 的正则表达式具有许多 PCRE 不具备的功能,包括以\%\\_开头的所有内容。 - too much php
2
@Bryan:因为_s比[ \t\r\n]更容易。仍有许多插件和功能依赖于vim正则表达式语法,因此编译它会很棘手。(不可否认,如果你让它工作起来,我会整天使用它...) - too much php
5
想要提及这个Vim技巧,即在编译时启用+perl选项后,在Vim中执行Perl搜索/替换操作:http://vim.wikia.com/wiki/Perl_compatible_regular_expressions - acorello
显示剩余3条评论

10

4
“要实现那个翻译需要编写一千多行的vim代码!”公平点说,其中(目前)有279行是注释。不过还是有803行(总计1082行)的代码!相当庞大。 - Victor Zamanian
我很好奇为什么他们不能使用正则表达式进行翻译。 - WhyNotHugo

2
除了已经提到的原因,Vim在正则表达式方面还有一些优势。例如,要匹配正向后查找,我们可以这样做:
:%s/^foo \zsbar/moo/g

上述命令将在以“foo”开头的行中用“bar”替换“moo”。 \zs 使得设置正向后顾和 \ze 使得设置正向前瞻更加容易。
我们还有一种方法只匹配“可视区域” -> \%V。
:'<,'>s/\%Vthis/that/g

尽管使用全局标志"g",但由于\%V的限制,替换仅限于可视区域。
阅读一篇关于vim正则表达式的神奇之处的文章,请访问此链接:https://bitbucket.org/snippets/sergio/7nzqxx 我们还可以在vim替换中使用一些"子匹配"技巧。请访问此链接:https://dev.to/voyeg3r/vim-math-on-vim-substitution-4obo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接