【问题标题】:Why would a regex work in Sublime and not in vim?为什么正则表达式可以在 Sublime 而不是 vim 中工作?
【发布时间】:2014-05-30 15:44:03
【问题描述】:

尝试搜索在this answer 中找到的正则表达式:

(,)(?=(?:[^']|'[^']*')*$)

我尝试在 Sublime 中进行搜索,结果很好(大约 700 个结果)。尝试替换结果时,内存不足。在 vim 中尝试 /(,)(?=(?:[^']|'[^']*')*$) 首先搜索,但它没有找到该模式的任何实例。还尝试在正则表达式中使用\ 转义所有()

【问题讨论】:

  • 有正则表达式vim插件吗?
  • @Costa 肯定有,但我的意思是用/<query string> 命令搜索

标签: regex vim sublimetext2


【解决方案1】:

Vim 使用自己的正则表达式引擎和语法(顺便说一下,它早于 PCRE),因此从 perl 或其他编辑器移植正则表达式很可能需要一些工作。

许多不同之处太多了,无法在此处详细列出,但:help pattern:help perl-patterns 会有所帮助。

无论如何,对正则表达式的这种快速而肮脏的重写似乎适用于链接问题中给出的示例:

/\v(,)(\@=([^']|'[^']*')*$)

请参阅 :help \@=:help \v

【讨论】:

    【解决方案2】:

    一种可能的解释是,Sublime 中使用的正则表达式引擎与 vim 中使用的引擎不同。

    并非所有的正则表达式引擎都是一样的;它们并不都支持相同的功能。 (例如,“负前瞻”功能可能非常强大,但并非所有引擎都支持它。某些功能的语法因引擎而异。)

    这里提供了正则表达式引擎的简要比较:

    http://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines

    【讨论】:

    • “并非所有的正则表达式引擎都是平等的”——这会让很多人流泪
    【解决方案3】:

    不幸的是,Vim 使用了不同的引擎,“正常”的正则表达式无法工作。 您提到的正则表达式并不完美:它不会跳过转义引号,但据我了解,它对您来说已经足够了。试试这个,如果不匹配,请把那件发给我。

    \v^([^']|'[^']*')*\zs,
    

    一点解释:

    \v 启用非常神奇的搜索,以避免复杂的转义规则

    ([^']|'[^']*') 匹配除引号和一对 qoutes 之外的所有符号

    \zs表示选择的开始;您可以将其视为lookbehind的替代品。

    【讨论】:

      【解决方案4】:

      你必须将|转义,否则在vim下不起作用。您还应该转义圆括号,除非您正在搜索 '(' 或 ')' 字符。

      有关 vim 中正则表达式使用的更多信息,请访问 vimregex.com

      【讨论】:

      • 我已经避开了圆括号。转义 | 并不能解决问题。
      • @cabe56 如果您在 cmets 中阅读我的链接,VIM 断言不同,请尝试 \(,\)\@=\([^']\|'[^']*'\)*$
      猜你喜欢
      • 2019-02-07
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2015-08-10
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      相关资源
      最近更新 更多