这是我尝试过的正则表达式:
/\v^.*.wpd\_.\{-}^\s*$
然而,“包括换行符在内的所有字符”字符类
\{-}
后面的非贪婪运算符\{-}
似乎不起作用。如果我使用/\v^.*.wpd\_.*
我需要匹配下一行包含“.wpd”的所有行,可以使用*
。然而,一旦将*
更改为\{-}
,就无法匹配任何内容。
我做错了什么?谢谢!
/\v^.*.wpd\_.\{-}^\s*$
\{-}
后面的非贪婪运算符\{-}
似乎不起作用。如果我使用/\v^.*.wpd\_.*
我需要匹配下一行包含“.wpd”的所有行,可以使用*
。然而,一旦将*
更改为\{-}
,就无法匹配任何内容。
我做错了什么?谢谢!
/\v^.*\.wpd\_.{-}\n\s*\n
正则表达式中不能在内部使用原子符号^
(同样适用于$
),它只有在前面(后面)才有特殊含义;否则,它就会被视为普通字符。如果要匹配换行符,请在正则表达式中使用\n
,如perreal的答案所示。
\_^
和\_$
。因此,表达式可以简化为\v^.*.wpd\_.{-}\_^\s*\_$
。 - Ashutosh Jindal(?s)[^\n\r]*\.wpd(.*?)\n{2}
(?s) - 打开“点匹配换行符”以跨行搜索
[^\n\r]* - 从行首开始,匹配任何不是换行符的内容
.wpd - 匹配“.wpd”
(.*?) - 非贪婪地匹配任何内容,包括换行符(因为我们之前打开了 (?s))
\n{2} - 直到找到两个连续的换行符,即空行
:)
/\v^.*\.wpd\_.{-}\n\s*\n
\v
(小写的v):这是“非常魔法”的运算符,表示在它后面的模式中,除了“0”-“9”,“a”-“z”,“A”-“Z”和“_”之外的所有ASCII字符都具有特殊含义。
因此,在模式中不需要转义字符,如*
,^
,$
,但是对于_
具有特殊含义(例如修改.
的行为以匹配换行符),则需要转义。因此,如果设置了\v
,则需要使用\_
才能使后者具有特殊含义。
要真正欣赏到“非常魔法”简化表达式的程度,请将其与使用“非常NOmagic”(大写\V
)的相同表达式进行比较:/\V\^\.\*.wpd\_\.\{-}\n\s\*\n
(非常无魔法)与/\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*\_$
这或许更接近回答了楼主为什么无法在表达式中使用行首字符的问题。
太好了!