Ago 08 2008
Búsqueda avanzada mediante expresiones regulares (regexp) y reemplazo medio
Ya sabemos como poder buscar y reemplazar cadenas por los artículos anteriores. Sin embargo existe una manera más avanzada y potente de poder buscar cadenas, y es mediante el uso de expresiones regulares, antes de comenzar a explicar expresiones regulares, detallaré cuales son los comandos sobre Emacs los cuales nos permiten hacer uso de ellas:
- C-M-s : ‘isearch-forward-regexp‘; nos permite buscar hacia delante una cadena dado un patrón.
- C-M-r : ‘isearch-backward-regexp‘; nos permite buscar hacia detrás una cadena dado un patrón.
- C-M-s C-M-s : nos permite buscar hacia delante de forma incremental una cadena dado un patrón.
- C-M-r C-M-r : nos permite buscar hacia detrás de forma incremental una cadena dado un patrón.
En el momento que utilicemos uno de estos dos primeros comandos se nos preguntará que patrón debemos usar para buscar cadenas y aquí es donde entra en juego el uso de las expressiones regulares para poder realizar esta búsqueda avanzada, tan sólo citaré las más comunes:
- ^ : Principio de línea
- $ : Fin de línea
- . : Cualquier carácter (1)
- ? : Cualquier carácter (0 o 1)
- * : Cualquier carácter (0 o más coincidencias)
- + : Cualquier carácter (1 o más coincidencias)
- \< : Principio de palabra
- \> : Fin de palabra
- [ ] : Rango de carácteres
- \s, \S : Carácter en blanco o cualquier carácter excepto un carácter en blanco.
- \d, \D : Dígito o cualquier carácter excepto un dígito.
- \w, \W : Cualquier cáracter del alfabeto o dígito (incluyendo guión abajo). O cualquier carácter que no sea del alfabeto ni un número ni un guión abajo.
- \| : Or condicional
- \(\) : Grupo parental
Pondré un ejemplo simple de cada uno, para aclarar el uso de expresiones regulares:
- ^foo : Líneas que comiencen por la palabra foo.
- bar$ : Líneas que terminen por la palabra bar.
- a.b : Palabras que tengan una a al principio, una b al final y cualquier carácter entre ambas axb, adb, abb, etc.
- a*b : Palabras que tengan una a al principio, una b al final y cualquier carácter entre ambas o no axb, adb, abb, ab, etc.
- a+b : Palabras que tengan una a al principio, una b al final y cualquier carácter(s) entre ambas axb, adb, abb, acccccb, adfghb, etc.
- <\foo : Palabras que comiencen por foo.
- bar\> : Palabras que acaben en bar.
- [a-zA-Z] : Cualquier letra del alfabeto, en mayúsculas o minúsculas.
- \(a\|b\|c\|d\)x : Palabras que contengan ax, bx, cx o dx.
En la misma quick reference card de emacs podréis encontrar un apartado para expresiones regulares. Y, aunque todos los lenguajes usan de forma parecida las mismas reglas para trabajar con expresiones regulares, no siempre es así, así que podemos hacer referencia a la web de Scott Klarr donde tenemos un artículo sólo dedicado a guías de referencia para expresiones regulares.
Para el reemplazo avanzado podríamos hacer uso C-M-% o bien mediante su nombre de comando M-x query-replace-regexp, o bien tambien podemos hacer uso de M-x isearch-query-replace-regexp la cual no tiene keystroke asociada por defecto.