[英]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
\\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
(非常神奇)
^.*\\.wpd
:贪婪地匹配从行首( ^
)到.wpd
任何内容( .*
)
\\_.
: 匹配单个字符,可以是任何字符,包括换行符。
请注意,设置\\v
,模式必须如上所述转义下划线。
{-}
:是*
量词的非贪婪等价物。 因此,在.*BLAH
匹配到 BLAH 之前最多可能的字符的情况下, .{-}BLAH
将匹配最少可能的字符。 要查看此操作,请查看此内容(在这种情况下,我必须使用?
而不是{-}
因为该正则表达式是 PCRE):
\\n\\s*\\n
: 匹配可能包含一个或多个空格或制表符的空行
\\_.{-}\\n\\s*\\n
: 结合以上两者并表示
匹配最少可能的字符数,包括换行符 ( \\_.
) 直到一个空行 ( \\n\\s*\\n
)
\\v^.*\\.wpd\\_.{-}\\n\\s*\\n
:最后把它放在一起,
设置非常神奇的运算符(可能是为了简化模式,不需要转义除特殊含义的_
之外的任何内容),搜索包含.wpd
任何行并匹配直到最接近的空行。
唯一的修改是用于表示空行的表达式。 我发现根据行首 ('^') 和行尾 ('$') 字符定义空行很有用,但是按原样,它们不能在正则表达式中的任何地方使用,除了分别是开头和结尾。
对于上述用例,有可以在正则表达式中的任何地方使用的变体,即:分别为:'_^' 和\\_$
。 因此,空行表达式可以写为\\_^\\s*\\_$
而不是\\n\\s*\\n
,从而得到完整的表达式:
\\v^.*.wpd\\_.{-}\\_^\\s*\\_$
这可能更接近于回答 OP 关于为什么他们无法在表达式中使用行首字符的问题。
呼!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.