Grupos y capturas reemplazando texto con expresiones regulares
Publicado el Miércoles, 20 de noviembre de 2024Las expresiones regulares nos permiten agrupar patrones y "capturarlos". Luego podemos usar el valor de esos grupos con "back references" (¿referencias posteriores?). Últimamente vengo usando cada vez más replace-regexp
en Emacs y aprovechando que tuve que hacer uso de estas características, lo comparto por acá.
Estaba editando código Ruby y dado un Array de Hashes, quería reemplazar todas las llaves en los Hashes del tipo String a Symbol:
En Emacs, al presionar Alt x - replace-regexp Enter
entramos a un mini-buffer donde tenemos que ingresar una expresión regular. Lo que quería machear en este caso es "nombre":
y reemplazarlo por nombre:
. La expresión regular que usé fue:
Las llaves tenían valores con letras y guión bajo ("snake case"). Así que uso [a-z_]+
para machear una o más ocurrencias de letras de a
a z
y _
. Con el paréntesis agrupo el valor en snake case, en el mini-buffer de replace-regexp
los signos de paréntesis tienen que estar escapados con \
. Ahí me queda un patrón agrupado.
Al presionar enter, replace-regexp
pregunta con qué queremos reemplazar la expresión regular. Haciendo uso de las capturas y "back reference", lo que agrupé en el paréntesis está disponible como \1
. Así que como quiero que "nombre":
se transforme en nombre:
, puedo usar: \1:
.
En el caso que tengamos más de un patrón agrupado, podemos usarlos con \1
, \2
y así sucesivamente.
El ejemplo es bastante sencillo, pero al estar trabajando en una base de código amplia, reemplazar con expresiones regulares ahorra un montón de tiempo. Generalmente tiendo a usar replace-string
en Emacs, que es más un reemplazo literal. Sinceramente replace-regexp
me intimidaba un poco (creo que más que nada porque no tenía muy claro qué caracteres había que escapar y me costaba armar expresiones regulares). Pero cuando funciona nos ahorra un montón de tiempo y trabajo, y un poco da esa sensación de tener superpoderes.
Las expresiones regulares son una herramienta muy potente que valen la pena aprender. En mi experiencia son bastante portables generalmente, el conocimiento adquirido sirve en Ruby, Bash, awk, sed y por supuesto Emacs 🙂
No hay comentarios en este post
Feed de comentariosDejar un comentario