我正在尝试编写一个RegEx,它将匹配任何包含“.wpd”的行,然后匹配所有行,直到它到达一个空行(包括空行)。
这是我尝试过的:
/\v^.*.wpd\_.\{-}^\s*$
但是,“所有字符包括新行”字符类\{-}
之后的非贪婪运算符\{-}
似乎不起作用。如果我使用
/\v^.*.wpd\_.*
将匹配包含“.wpd”的下一行,然后匹配所有行。但是,只要我将*
更改为\{-}
,它就完全不匹配。
我做错了什么?谢谢!
答案 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
\v
(小写v):这是“ very magic”运算符,
表示在模式之后的所有ASCII字符(除
'0'-'9','a'-'z','A'-'Z'和'_'具有特殊含义。
因此,*
之类的字符^
,$
不需要在模式中转义,但要使_
具有特殊含义(例如修改.
的行为以匹配换行符),则必须逃脱了因此,设置\v
时,您需要\_
才能使后者具有特殊含义。
要真正欣赏very magic
简化了多少表达式,请使用very NOmagic
(大写\V
)将其与相同的表达式进行比较:
{{ 1}}(非常神奇)与
/\V\^\.\*.wpd\_\.\{-}\n\s\*\n
(非常神奇)
/\v^.*\.wpd\_.{-}\n\s*\n
:从行(^.*\.wpd
)到.*
的所有内容(^
)贪心地匹配(.wpd
)
< / p>
\_.
:匹配单个字符,可以是
任何字符,包括换行符。
请注意,设置\v
时,模式必须如上所述已转义下划线。
{-}
:是*
量词的非贪婪等效项。因此,在.*BLAH
匹配最可能直到BLAH的字符的地方,.{-}BLAH
将匹配最少的字符。要了解这一点,请看一下它(在这种情况下,我必须使用?
而不是{-}
,因为该正则表达式为PCRE):
{{3 }}
\n\s*\n
:匹配可能包含一个或多个空格或制表符的空白行
\_.{-}\n\s*\n
:将上述两个内容结合起来并表示
匹配最少数量的字符,包括换行符(\_.
)直到空白行(\n\s*\n
)< br />
\v^.*\.wpd\_.{-}\n\s*\n
:最后,总括起来,
设置了 very magic 运算符(可能是通过简化{{{ 1}}(具有特殊含义),搜索包含_
的任何行并匹配直到最接近的空行。
唯一的修改是用于表示空白行的表达式。我发现根据行首('^')和行尾('$')字符定义空白行很有用,但是按原样,它们不能在正则表达式中的任何位置使用开始和结束。
对于上述用例,存在可以在正则表达式中的任何位置使用的变体,分别是:'_ ^'和.wpd
。因此,空行表达式可以写为\_$
而不是\_^\s*\_$
,从而形成完整的表达式:
\n\s*\n
这也许更接近于回答OP的问题,即为什么他们不能在表达式中使用行首字符。
Ph!