Match linhas até certo conjunto de caracteres no vim

0
{hola}

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

Eu preciso corresponder a todos dentro da string "{
        \ defn {[34, \ cite {Lint: 1998: ICT: 552386}]} "e o último caractere}. Você poderia me ajudar por favor?

Estou tentando isso

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

mas isso não funciona

    
por juaninf 16.08.2017 / 13:50

1 resposta

1

Esta pergunta provavelmente deve estar no site vi e vim ...

Seu regex tem muitos problemas.

  1. Há espaço em branco após o primeiro caractere { , portanto, a parte {\n nunca será igual. Tente excluir este espaço em branco ou adicionar \s*

  2. Você provavelmente não deseja usar .\+ , pois isso corresponderá a mais do que o necessário, provavelmente causando alguns falsos positivos. Você provavelmente deseja .\{-} , porque esse é um qualificador não-voraz , o que significa que sempre corresponderá o mínimo possível. Sem isso, você irá combinar linhas como

    \defn{[34,\cite{Lint:1998:ICT:552386 \hello world \here's a bunch of random crap you don't want to match ]}]} }]}
    
  3. Você definitivamente não deseja usar \_.\+ porque isso corresponderá a tudo até o final do arquivo. De :h \_.

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

    Mais uma vez, você quer o quantificador não ganancioso, \_.\{-}

  4. Por que você está tentando corresponder 2 } caracteres no final? Seu texto claramente só termina com um.

  5. Você não precisa escapar de um caractere } .

Juntando tudo, tente usar esse regex:

{.*\n.*\defn{\[\d\+,\s*\cite{.\{-}}]}\_.\{-}\n}
    
por 16.08.2017 / 18:38

Tags