2009-08-20 11 views
24

¿Cómo se hace una consulta-replace-regexp en Emacs que coincidirá en múltiples líneas?Emacs query-replace-regexp multiline

como un ejemplo trivial que me gustaría <p>\(.*?\)</p> para que coincida con

<p>foo 
bar 
</p> 
+1

Supongo que vio emacswiki: http://www.emacswiki.org/emacs/MultilineRegexp – seth

+1

Sí, lo vi pero no pude hacerlo funcionar con query-replace-regexp. Todavía estoy intentando usar Re-Builder para probarlo ... con suerte lo resolveré pronto –

+1

El ejemplo es muy malo, porque analizar HTML con expresiones regulares generalmente no es una buena idea. – Svante

Respuesta

20

Prueba las clases de caracteres. Siempre que use solo juegos de caracteres ASCII, puede usar [[:ascii:]] en lugar del punto. Usar el [[:ascii:][:nonascii:]] más largo debería funcionar para todo.

+0

impresionante gracias amigo –

+1

¿Y si no está utilizando solo ASCII? – Jackson

+0

[[: ascii:] [: nonascii:]] * me da un desbordamiento de la pila – helcim

22
M-x re-builder 

es su amigo. Y me llevó a esta expresión regular:

"<p>\\(.\\|\n\\)*</p>" 

que es la versión de cadena de

<p>\(.\|^J\)*</p>   ;# where you enter ^J by C-q C-j 

y que funciona para mí cuando hago re-search-forward, pero no cuando lo haga 'query-replace-regexp. Seguros de por qué ...

Ahora, cuando se hace una 're-search-forward (también conocido como C-u C-s), puede escribir M-% que le pedirá un reemplazo (a partir de Emacs 22). Entonces, puede usar eso para hacer su búsqueda y reemplazarlo con la expresión regular anterior.

nota, la expresión regular anterior coincidirá hasta que la última </p> encontrado en la memoria intermedia, lo que probablemente no es lo que quiere, a fin de utilizar la re-constructor para construir una expresión regular que se acerca más a lo que quiere. Obviamente, las expresiones regulares no pueden contar entre paréntesis, por lo que está solo para eso, depende de qué tan sólida sea la solución que desee.

+0

¿Hay archivos de información para el re-constructor? Tengo curiosidad sobre cómo usarlo. – seth

+1

No es que yo pueda encontrarlo. La Wiki de Emacs tampoco tiene mucho en ella. Pero es bastante autoexplicativo (no es todo de Emacs :). Después de ingresar 're-builder', escribe' C-c C-h' y obtendrás una lista de enlaces que incluyen los que se aplican a 're-builder' y todos comienzan con' C-c'. –

+0

Yah, llegué tan lejos. Solo estaba buscando algo un poco más profundo. ¡Gracias! – seth