在vim搜索模式下无法使用特殊字符类查找文本

时间:2018-04-03 17:21:54

标签: regex vim

当有空格字符时,尝试在vim中使用正则表达式搜索字符串失败。

我希望vim找到两个

<title><![CDATA[formTempoFisio]]></title>

作为

<question><![CDATA[<p>
        <span style="font-family: Arial, sans-serif; font-size: 9pt;">{(strtotime(datInicioFisioAt)-strtotime(datLesao))/60/60/24}</span></p>
]]></question>

请注意,在<p>后面和<span style="font-family: Arial, sans-serif; font-size: 9pt;">{(strtotime(datInicioFisioAt)-strtotime(datLesao))/60/60/24}</span></p>后面有一个新行。

我在集合中使用特殊字符。我的搜索正则表达式是:

/<!\[CDATA\[[[:alnum:][:space:][:return:][:tab:]]\+\]\]>

但只有在没有换行符时才会找到vim。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

有几个问题。

  • [:space:]匹配所有空白字符,包括\r\t,因此[:return:][:tab:]是多余的。
  • [:alnum:]匹配ASCII字母和数字。它不匹配,例如<=",因此<span style="无法匹配。
  • 要跨行边界匹配,您需要在字符类中显式包含\n或在\_前添加。

您可以使用以下正则表达式:

/<!\[CDATA\[\_.\{-}\]\]>

匹配<![CDATA[,后跟包括换行符(\_.)在内的任何字符重复0次或更多次,但尽可能少(\{-},&#34;非贪婪&# 34;),然后是]]>

如果要明确列出第二个示例中出现的字符,则会变得更复杂:

/<!\[CDATA\[\_[[:alnum:][:space:]<>=":,;{}()\/-]\{-}\]\]>

它仍然不匹配,例如'+,可以很容易地出现在代码中,因此限制允许的字符集似乎没什么意义。