在 vim 中匹配行直到特定的字符集

在 vim 中匹配行直到特定的字符集
{hola}

{   
    \defn{[34,\cite{Lint:1998:ICT:552386}]}                                                                                                                      
\[
    R\coloneqq n^{-1}\log_2|\code|                                                                                                                            
\]
is called the rate of $\code$                                                                                                                                 
}   

我需要匹配字符串“{
\defn{[34,\cite{Lint:1998:ICT:552386}]} ”和最后一个字符 } 内的所有内容。您能帮帮我吗?

我正在尝试

{\n.*\\defn{\[\d\+,\s*\\cite{.\+}]}\_.\+\n}\}

但这不起作用

答案1

这个问题可能应该继续vi 和 vim 站点...


您的正则表达式有很多问题。

  1. 第一个字符后有空格{,因此该{\n部分永远不会匹配。请尝试删除此空格或添加\s*

  2. 您可能不想使用.\+,因为这将匹配超过必要的次数,可能会导致一些误报。您可能想要.\{-},因为这是一个非贪婪限定符,这意味着它将始终匹配尽可能少的行。如果没有这个,你将匹配如下行

    \defn{[34,\cite{Lint:1998:ICT:552386 \\hello world \\here's a bunch of random crap you don't want to match ]}]} }]}
    
  3. 你肯定不想使用,\_.\+因为这将匹配文件末尾的所有内容。从:h \_.

                                */\_.*
    \_. Matches any single character or end-of-line.
        Careful: "\_.*" matches all text to the end of the buffer!
    

    再次,你需要非贪婪量词,\_.\{-}

  4. 为什么您要尝试匹配}末尾的 2 个字符?您的文本显然仅以一个字符结尾。

  5. 您不需要转义}字符。

把所有这些放在一起,尝试使用这个正则表达式:

{.*\n.*\\defn{\[\d\+,\s*\\cite{.\{-}}]}\_.\{-}\n}

相关内容