【问题标题】:What's the difference between vim regex and normal regex?vim 正则表达式和普通正则表达式有什么区别?
【发布时间】:2010-10-05 14:12:04
【问题描述】:

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

【问题讨论】:

  • 定义“普通正则表达式”。每个正则表达式引擎都至少与几乎所有其他引擎略有不同。

标签: regex linux vim


【解决方案1】:

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

曾几何时,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之类的东西。

【讨论】:

  • 这是最好的答案,帮助我弄清楚我在寻找什么,谢谢。
  • vimregex 站点的链接很好...虽然它可能需要更改“较新”版本,因为它最后一次更新是在 2002 年。:|
  • 我想你的意思是:x*? x\{-} 匹配 0 个或更多的 x,非贪婪
【解决方案2】:

如果您所说的“普通正则表达式”是指 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是什么意思?
  • 它不仅没有提供好的摘要,而且它的摘要几乎完全没有价值。投反对票。为什么选择这个作为答案?
【解决方案3】:

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

【讨论】:

  • 传统正则表达式是指基本正则表达式 (BRE) 还是 PCRE?
  • pcre :) 更多文本文本
  • 为什么使用:help /\v而不是:help \v?斜线/ 是干什么用的?
  • 这实在是太棒了!我也爱它 !太糟糕了,这不能成为默认值?参考stackoverflow.com/questions/3760444/…,但有缺点。
【解决方案4】:

有一个名为eregex.vim 的插件将PCRE(Perl 兼容的正则表达式)转换为Vim 的语法。需要over a thousand lines of vim to achieve that translation!我想它也可以作为差异的精确文档。

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2013-11-09
      • 2013-10-07
      • 2013-04-16
      相关资源
      最近更新 更多