regex vim regex-greedy

regex - ¿Cómo puedo hacer que mi partido no sea codicioso en vim?



vim search regex (8)

Con /v (como se sugiere en varios comentarios)

:%s//v(style|class)/=".{-}"//g

Tengo un gran archivo HTML que tiene un montón de marcado que se ve así:

<p class="MsoNormal" style="margin: 0in 0in 0pt;"> <span style="font-size: small; font-family: Times New Roman;">stuff here</span> </p>

Estoy tratando de hacer una búsqueda y reemplazo Vim para deshacerme de todos class="" y style="" pero estoy teniendo problemas para hacer que el partido no esté en juego.

Mi primer intento fue este

%s/style=".*?"//g

Pero a Vim no parece gustarle el ? . Desafortunadamente eliminando el ? hace el partido demasiado codicioso.

¿Cómo puedo hacer que mi partido sea ungreedy?


Dia de dia

El procesamiento de expresiones regulares de Vim no es demasiado brillante. Descubrí que la sintaxis de expresiones regulares para sed es la más adecuada para las capacidades de vim.

Por lo general, establezco el resaltado de búsqueda en (: set hlsearch) y luego juego con la expresión regular después de ingresar una barra para ingresar al modo de búsqueda.

Edit: Mark, ese truco para minimizar el emparejamiento codicioso también está cubierto en el excelente libro "Sed & Awk" de Dale Dougherty ( enlace de Amazon saneado ).

El capítulo tres "Comprender la sintaxis de expresiones regulares" es una excelente introducción a las capacidades de expresiones regulares más primitivas relacionadas con sed y awk. Sólo una lectura corta y muy recomendable.

HTH

aclamaciones,


El complemento eregex.vim maneja operadores no codiciosos al estilo Perl *? y +?


En lugar de .* Use ./{-} .

%s/style="./{-}"//g

También, ver :help non-greedy


He encontrado que una buena solución para este tipo de pregunta es:

:%!sed ...

(o perl si lo prefieres). IOW, en lugar de aprender las particularidades de expresiones regulares de vim, use una herramienta que ya conoce. Usando perl haría el? Trabajo modificador para desentrañar el partido.


La búsqueda no codiciosa en vim se realiza mediante el operador {-}. Me gusta esto:

%s/style="./{-}"//g

sólo inténtalo:

:help non-greedy


Qué hay de malo en

%s/style="[^"]*"//g


Si estás más cómodo sintaxis de expresiones regulares de PCRE, que

  1. Es compatible con el operador no codicioso?, como pidió en OP; y
  2. no requiere operadores de cardinalidad y agrupación de backwhacking (un requisito de sintaxis Vim totalmente contraintuitivo ya que no se corresponden los caracteres literales sino que se especifican operadores); y
  3. tienes [g] vim compilado con la característica perl, prueba usando

    : ver e inspeccionar características; si + perl está ahí estás listo para ir)

intente buscar / reemplazar usando

:perldo s///

Ejemplo. Intercambie los atributos src y alt en la etiqueta img:

<p class="logo"><a href="/"><img src="/caminoglobal_en/includes/themes/camino/images/header_logo.png" alt=""></a></p> :perldo s/(src=".*?")/s+(alt=".*?")/$2 $1/ <p class="logo"><a href="/"><img alt="" src="/caminoglobal_en/includes/themes/camino/images/header_logo.png"></a></p>