繁体   English   中英

Vim RegEx:匹配直到空行

[英]Vim RegEx: Match until blank line

我正在尝试编写一个正则表达式来匹配包含“.wpd”的任何行,然后匹配之后的所有行,直到它到达一个空行(包括空行)。

这是我尝试过的:

/\v^.*.wpd\_.\{-}^\s*$

但是,“所有字符包括新行”字符类\\{-}之后的非贪婪运算符\\{-}似乎不起作用。 如果我使用

/\v^.*.wpd\_.*

这将匹配包含“.wpd”的下一行,然后匹配之后的所有行。 但是,一旦我将*更改为\\{-} ,它就根本不匹配任何内容。

我究竟做错了什么? 谢谢!

这个似乎有效:

/\v^.*\.wpd\_.{-}\n\s*\n

您不能在正则表达式中使用原子^ (与$相同),它仅在前面(后面)有其特殊含义; 在其他地方,它被视为文字字符。 使用\\n匹配\\n则表达式中的换行符,如 perreal 的答案所示。

(?s)[^\n\r]*\.wpd(.*?)\n{2}

(?s) - 打开“点匹配换行符”以跨行搜索

[^\\n\\r]* - 从行首开始,匹配任何不是换行符的内容

.wpd - 匹配“.wpd”

(.*?) - 不贪婪地匹配任何内容,包括换行符(因为我们之前打开了 (?s) )

\\n{2} - ... 直到您在一行中找到两个换行符,这将是一个空行

:)

以下是对@perreal 上面的答案以及我自己的答案版本的大量支持评论,我觉得它更直观。

让我们根据http://vimdoc.sourceforge.net/htmldoc/pattern.html#/magic剖析以下正则表达式

/\v^.*\.wpd\_.{-}\n\s*\n
  1. \\v (小写 v):这是“非常神奇”的运算符,它表示在模式中除 '0'-'9'、'a'-'z'、'A'-'Z' 之外的所有 ASCII 字符和'_'有特殊含义。

    因此,像字符*^$不必在模式中逃脱,但对于_有特殊含义(如修改的行为.匹配换行符),它需要进行转义。 因此,设置\\v ,您需要\\_才能使后者具有特殊含义。
    要真正了解very magic简化表达式,请将其与使用very NOmagic (大写\\V )的相同表达式进行比较:

    /\\V\\^\\.\\*.wpd\\_\\.\\{-}\\n\\s\\*\\n {-}\\n\\s\\* /\\V\\^\\.\\*.wpd\\_\\.\\{-}\\n\\s\\*\\n (非常游牧)vs
    /\\v^.*\\.wpd\\_.{-}\\n\\s*\\n (非常神奇)

  2. ^.*\\.wpd :贪婪地匹配从行首( ^ )到.wpd任何内容( .*

  3. \\_. : 匹配单个字符,可以是任何字符,包括换行符。
    请注意,设置\\v ,模式必须如上所述转义下划线。

  4. {-} :是*量词的非贪婪等价物。 因此,在.*BLAH匹配到 BLAH 之前最多可能的字符的情况下, .{-}BLAH将匹配最少可能的字符。 要查看此操作,请查看此内容(在这种情况下,我必须使用?而不是{-}因为该正则表达式是 PCRE):

    在此处输入图片说明

  5. \\n\\s*\\n : 匹配可能包含一个或多个空格或制表符的空行

  6. \\_.{-}\\n\\s*\\n : 结合以上两者并表示
    匹配最少可能的字符数,包括换行符 ( \\_. ) 直到一个空行 ( \\n\\s*\\n )

  7. \\v^.*\\.wpd\\_.{-}\\n\\s*\\n :最后把它放在一起,
    设置非常神奇的运算符(可能是为了简化模式,不需要转义除特殊含义的_之外的任何内容),搜索包含.wpd任何行并匹配直到最接近的空行。


我的版本使用行尾字符的变体

唯一的修改是用于表示空行的表达式。 我发现根据行首 ('^') 和行尾 ('$') 字符定义空行很有用,但是按原样,它们不能在正则表达式中的任何地方使用,除了分别是开头和结尾。

对于上述用例,有可以在正则表达式中的任何地方使用的变体,即:分别为:'_^' 和\\_$ 因此,空行表达式可以写为\\_^\\s*\\_$而不是\\n\\s*\\n ,从而得到完整的表达式:

\\v^.*.wpd\\_.{-}\\_^\\s*\\_$

这可能更接近于回答 OP 关于为什么他们无法在表达式中使用行首字符的问题。

呼!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM