【问题标题】:Matching an expression including arbitrary lines with regex in Vim在 Vim 中将包含任意行的表达式与正则表达式匹配
【发布时间】:2013-07-02 13:20:46
【问题描述】:

在使用 Vim 打开的文本文件中,我试图匹配两个字符串 DRIVER_ACTIVITY 和 DriverGroup 的出现,其间有任意数量的行:

2013-07-01 05:06:23,801 DRIVER_ACTIVITY
2013-07-01 05:06:23,804 text
2013-07-01 05:06:23,804 more text
2013-07-01 05:06:23,805 DriverGroup

使用:

/DRIVER_ACTIVITY(.*)DriverGroup/s  
/DRIVER_ACTIVITY((.|\n|\r)*)DriverGroup  
/\vDRIVER_ACTIVITY((.|\n|\r)*)DriverGroup  
/DRIVER_ACTIVITY\[\S\s\]*DriverGroup

没有匹配项。如何匹配所有行/新行?

【问题讨论】:

  • 不要使用vim,但可能内联多行(?s)/(?s)DRIVER_ACTIVITY(.*?)DriverGroup
  • 您的第三次尝试(以\v 开头)匹配我。
  • 对我来说,第三次尝试包含尾随空格。没有它们,它匹配。

标签: regex vim


【解决方案1】:

好的,我看到了问题。在这个示例文件中,第三次尝试匹配,Ingo Karkat 和 Explosion Pills 的建议也是如此。我没有成功的原因是因为所有这些似乎都很贪婪。这就是为什么“大文件”中没有这些匹配项的原因,因为它很贪婪并且一直在寻找,在几秒钟内没有返回匹配项,尽管标记位于第一个匹配项应该出现的同一行。所以它实际上匹配但我的耐心是问题:)

我让它变得不贪心并且它起作用了: /DRIVER_ACTIVITY_.{-}DriverGroup

【讨论】:

    【解决方案2】:

    The \_s construct searches spaces including newlines

    /DRIVER_ACTIVITY\(\_s\|.\)*DriverGroup
    

    【讨论】:

      【解决方案3】:

      如果你想使用更常见的(...) 进行分组,你需要包含\v 原子来将Vim 的正则表达式语法切换为“非常神奇”;否则,它是\(...\)。但是对于你的情况,Vim 有一个特殊的原子匹配任意字符包括换行符\_.,像这样:

      /DRIVER_ACTIVITY\_.*DriverGroup
      

      没有办法学习 Vim 不同的正则表达式方言;见:help pattern

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-16
        • 1970-01-01
        • 2020-06-12
        相关资源
        最近更新 更多