Vim RegEx:匹配到空行

时间:2012-09-11 20:05:25

标签: regex vim newline

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

这是我尝试过的:

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

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

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

将匹配包含“.wpd”的下一行,然后匹配所有行。但是,只要我将*更改为\{-},它就完全不匹配。

我做错了什么?谢谢!

4 个答案:

答案 0 :(得分:7)

这个似乎有效:

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

答案 1 :(得分:6)

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

答案 2 :(得分:0)

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

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

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

.wpd - 匹配' .wpd'

(。*?) - 匹配任何东西,非贪婪,包括换行符(因为我们之前打开过(?s))

\ n {2} - ...直到你连续找到两个换行符,这将是一个空行

:)

答案 3 :(得分:0)

以下是对@perreal的答案以及我自己的答案的一个较大的支持性评论,我发现它更直观。

让我们根据http://vimdoc.sourceforge.net/htmldoc/pattern.html#/magic

剖析以下正则表达式
/\v^.*\.wpd\_.{-}\n\s*\n
  1. \v(小写v):这是“ very magic”运算符,     表示在模式之后的所有ASCII字符(除 '0'-'9','a'-'z','A'-'Z'和'_'具有特殊含义。

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

    {{ 1}}(非常神奇)与
    /\V\^\.\*.wpd\_\.\{-}\n\s\*\n(非常神奇)

  2. /\v^.*\.wpd\_.{-}\n\s*\n:从行(^.*\.wpd)到.*的所有内容(^)贪心地匹配(.wpd

    < / p>

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

  4. {-}:是*量词的非贪婪等效项。因此,在.*BLAH匹配最可能直到BLAH的字符的地方,.{-}BLAH将匹配最少的字符。要了解这一点,请看一下它(在这种情况下,我必须使用?而不是{-},因为该正则表达式为PCRE):

    {{3 }}

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

  6. \_.{-}\n\s*\n:将上述两个内容结合起来并表示
    匹配最少数量的字符,包括换行符(\_.)直到空白行(\n\s*\n)< br />

  7. \v^.*\.wpd\_.{-}\n\s*\n:最后,总括起来,
    设置了 very magic 运算符(可能是通过简化{{{ 1}}(具有特殊含义),搜索包含_的任何行并匹配直到最接近的空行。


我的版本使用了行尾换行符

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

对于上述用例,存在可以在正则表达式中的任何位置使用的变体,分别是:'_ ^'和.wpd。因此,空行表达式可以写为\_$而不是\_^\s*\_$,从而形成完整的表达式:

\n\s*\n

这也许更接近于回答OP的问题,即为什么他们不能在表达式中使用行首字符。

Ph!