【发布时间】:2010-10-05 14:12:04
【问题描述】:
我注意到 vim 的替代正则表达式与其他正则表达式有点不同。它们有什么区别?
【问题讨论】:
-
定义“普通正则表达式”。每个正则表达式引擎都至少与几乎所有其他引擎略有不同。
我注意到 vim 的替代正则表达式与其他正则表达式有点不同。它们有什么区别?
【问题讨论】:
“正则表达式”真正定义了算法,而不是语法。这意味着不同风格的正则表达式将使用不同的字符来表示同一件事。或者他们会在一些特殊字符前加上反斜杠,而其他人没有。它们通常仍会以相同的方式工作。
曾几何时,POSIX defined the Basic Regular Expression 语法 (BRE),Vim 很大程度上遵循。不久之后,还发布了扩展正则表达式 (ERE) 语法提案。两者的主要区别在于,BRE 倾向于将更多字符视为文字——“a”是“a”,但“(”是“(”,而不是特殊字符——因此涉及更多反斜杠赋予它们“特殊”的含义。
在此处单独讨论 Vim 和 Perl 之间的复杂差异很有用,但也值得一提的是 Vim 正则表达式与“公认”规范(您可能是指 Perl. ) 如上所述,它们的主要区别在于前面反斜杠的使用。
这里有一些明显的例子:
Perl Vim 解释 -------------------------- X? x\= 匹配 x 的 0 或 1 x+ x\+ 匹配 1 个或多个 x (xyz) \(xyz\) 使用方括号对匹配项进行分组 x{n,m} x\{n,m} 将 n 匹配到 x 的 m X*? x\{-} 匹配 x 的 0 或 1 个,非贪心 x+? x\{-1,} 匹配 1 个或多个 x,非贪心 \b \ 字边界 $n \n 先前分组匹配的反向引用这让您了解了最重要的差异。但是如果你做的事情比基础更复杂,我建议你总是假设 Vim-regex 与 Perl-regex 或 Javascript-regex 不同,并咨询Vim Regex website之类的东西。
【讨论】:
如果您所说的“普通正则表达式”是指 Perl 兼容的正则表达式 (PCRE),那么 Vim 帮助很好地总结了 Vim 的正则表达式和 Perl 的区别:
:help perl-patterns
这是从 Vim 7.2 开始的内容:
9. 与 Perl 模式比较 *perl-patterns* Vim 的正则表达式与 Perl 的最相似,就你能做什么而言。这 它们之间的区别主要是符号;这是哪里的摘要 它们不同: Perlspeak 中 Vimspeak 的能力 ~ -------------------------------------------------- -------------- 强制不区分大小写 \c (?i) 强制区分大小写 \C (?-i) 无反向引用分组 \%(atom\) (?:atom) 保守量词 \{-n,m} *?, +?, ??, {}? 0 宽度匹配 atom\@= (?=atom) 0 宽度不匹配原子\@! (?!原子) 0 宽度前匹配 atom\@ (?>atom) Vim 和 Perl 处理字符串中的换行符有点不同: 在 Perl 中,^ 和 $ 只匹配文本的开头和结尾, 默认情况下,但您可以设置 'm' 标志,让它们匹配 也嵌入了换行符。您还可以设置 's' 标志,这会导致 一种 。也匹配换行符。 (这两个标志都可以在里面更改 使用与上述 i 标志相同的语法的模式,顺便说一句。) 另一方面,Vim 的 ^ 和 $ 总是在嵌入的换行符处匹配,并且 你会得到两个独立的原子,\%^ 和 \%$,它们只匹配 分别是正文的开头和结尾。 Vim 解决了第二个问题 通过给你 \_ “修饰符”:把它放在 .或一个字符 类,它们也将匹配换行符。 最后,这些结构是 Perl 独有的: - 在正则表达式中执行任意代码:(?{perl code}) - 条件表达式:(?(condition)true-expr|false-expr) ...这些是 Vim 独有的: - 改变模式的魔力:\v \V \m \M (对于避免反斜杠非常有用) - 可选匹配的原子序列:\%[atoms] - \&(对于\|什么是“and”对于“or”;它强制多个分支 在一处匹配) - 按编号匹配行/列:\%5l \%5c \%5v - 设置比赛的开始和结束:\zs \ze【讨论】:
embedded newlines是什么意思?
试试 Vim 非常神奇的正则表达式模式。它的行为更像传统的正则表达式,只需在您的模式前面加上\v。请参阅:help /\v 了解更多信息。我喜欢它。
【讨论】:
:help /\v而不是:help \v?斜线/ 是干什么用的?
有一个名为eregex.vim 的插件将PCRE(Perl 兼容的正则表达式)转换为Vim 的语法。需要over a thousand lines of vim to achieve that translation!我想它也可以作为差异的精确文档。
【讨论】:
太宽泛的问题。运行 vim 并输入:help pattern。
【讨论】: