vim正则expression式和普通正则expression式有什么区别?

我注意到vim的替代正则expression式与其他正则expression式有点不同。 他们之间有什么区别?

Solutions Collecting From Web of "vim正则expression式和普通正则expression式有什么区别?"

如果用“正规正则表达式”表示Perl兼容正则表达式(PCRE),那么Vim帮助提供了Vim正则表达式和Perl之间差异的一个很好的总结:

:help perl-patterns 

这就是Vim 7.2所说的:

 9.比较Perl模式* perl-patterns *

 Vim的正则表达式与Perl的最相似,就你所能做的而言。 该
它们之间的区别大多只是符号; 这里是一个总结
他们不同:

在Perlspeak的Vimspeak能力〜
 -------------------------------------------------- --------------
强制不区分大小写\ c(?i)
强制区分大小写\ C(?-i)
 backref-less分组\ \(atom \)(?:atom)
保守量词\ { -  n,m} * ?, +?,??,{}?
 0-width匹配原子\ @ =(?= atom)
 0宽度不匹配atom \ @!  (?!原子)
 0-宽度前面的匹配atom \ @ <=(?<= atom)
 0-宽度前面的不匹配原子\ @ <!  (?!原子)
匹配不重试原子\ @>(?> atom)

 Vim和Perl处理字符串中的换行符有点不同:

在Perl中,^和$只能匹配文本的开头和结尾,
默认情况下,但你可以设置'm'标志,让他们匹配在
嵌入的换行符也是如此。 你也可以设置's'标志,这是由原因引起的
一个 。 以匹配换行符。  (这两个标志都可以在里面改变
使用与上面的i标志相同的语法的模式,顺便说一下。)

另一方面,Vim的^和$总是匹配嵌入的换行符
你会得到两个独立的原子,\%^和\%$,它们只能匹配
文本的开始和结束。  Vim解决了第二个问题
通过给你\ _“修饰符”:把它放在前面。 或一个字符
类,他们也将匹配换行符。

最后,这些结构对于Perl来说是独一无二的:
 - 在正则表达式中执行任意代码:(?{perl code})
 - 条件表达式:(?(condition)true-expr | false-expr)

 ...这些对Vim来说是独一无二的:
 - 改变模式的魔力:\ v \ V \ m \ M
    (对于避免反斜杠非常有用)
 - 可选匹配原子的序列:\%[atoms]
 - “(这是为什么”和“是”或“它”强制几个分支
   匹配在一个地方)
 - 按数字匹配行/列:\%5l \%5c \%5v
 - 设置匹配的开始和结束:\ zs \ ze

“正则表达式”确实定义了算法,而不是语法。 这意味着不同风格的正则表达式将使用不同的字符来表示同一个事物; 或者他们会在其他人没有的地方加上反斜线的特殊字符。 他们通常仍然以相同的方式工作。

曾几何时, POSIX定义了基本的正则表达式语法(BRE),Vim在很大程度上遵循。 不久之后,还发布了扩展正则表达式(ERE)语法提议。 两者之间的主要区别在于,BRE倾向于将更多的字符视为文字 – “a”是“a”,但也是“(”是“(”,而不是一个特殊的字符 – 因此涉及更多的反斜杠给他们“特殊”的含义。

Vim和Perl之间的复杂差异讨论在这里单独的评论是有用的,但是也值得一提的是Vim正则表达式与“接受”规范(你可能认为Perl是指Perl)不同的一些简单方法。以上,它们在使用前面的反斜杠时大不相同。

这里有一些明显的例子:

 Perl Vim说明
 ---------------------------
 X?  x \ =匹配x的0或1
 x + x \ +匹配x中的一个或多个
 (xyz)\(xyz \)使用括号来分组匹配
 x {n,m} x \ {n,m}将n匹配到x的m
 X*?  x \ { - }匹配0或1的x,非贪婪
 X +?  x \ { -  1,}匹配1个或多个x,非贪婪
 \ b \ <\>单词边界
 $ n \ n以前分组的匹配的反向引用

这给你一个最重要的区别的味道。 但是如果你做了比基础更复杂的任何事情,我建议你总是假设Vim-regex将会和Perl-regex或者Javascript-regex不同,并且可以参考Vim Regex网站 。

太广泛的问题。 运行vim并输入:help pattern

有一个名为eregex.vim的插件,它从PCRE(与Perl兼容的正则表达式)转换为Vim的语法。 它需要超过千行vim来实现这个翻译 ! 我想这也可以作为差异的准确记录。

尝试Vim的非常神奇的正则表达式模式。 它的行为更像传统的正则表达式,只需在\v加上你的模式。 请参阅:help /\v了解更多信息。 我喜欢它。