Archivo de la etiqueta: regexp

Lo que he aprendido: expresiones regulares en Emacs

Hablé hace tiempo de las expresiones regulares por aquí (de hecho fue lo que inauguró la sección Lo que he aprendido) pero todavía no me había puesto a usarlas en serio en Emacs para buscar y reemplazar cosas. Algún día tiene que ser el día, así que voy a ver si puedo resumir aquí para futura referencia la sintaxis de las expresiones regulares de Emacs, cómo se usan para buscar y qué ventajas nos ofrecen a la hora de reemplazar texto.

Sintaxis

La sintaxis de las expresiones regulares de Emacs tiene muchas cosas en común con las de otros programas y lenguajes de programación pero también tiene sus peculiaridades. Con C-h S regexp podemos ver toda la información sobre las regexp de Emacs, como soy muy maja os resumo aquí algunas cosas:

  • Los símbolos ., +, *, ? y [] funcionan de la manera típica:
    • . sustituye a cualquier carácter excepto al de nueva línea. Por ejemplo, a.b pillará cualquier secuencia de tres caracteres que empiece por a y acabe con b.
    • * localiza el carácter precedente cualquier número de veces, incluido cero. Por ejemplo, ca* captará caaaa pero también c.
    • + lo mismo que el anterior pero obligando a que el carácter precedente aparezca como mínimo una vez. Al contrario que ca*, ca+ no captará c. Para no confundirlo con el anterior a este le llamo el uno o más.
    • ? similar a * pero solo capta el carácter precedente una vez o cero. Siguiendo con el ejemplo, ca? captará c y ca? pero no caaa. Yo a este le llamo el si hay sí.
    • [] indica opciones. Por ejemplo, [ac]a encontrará las cadenas aa y ca. Su contrario es [^] que elimina las opciones entre corchetes, de este modo, [^ac]a encontrará ba pero no ca.
  • En Emacs hay clases sintácticas que empiezan por \s y su negación por \S. Por ejemplo, \sw indica un carácter de palabra (letras en minúscula o mayúscula y dígitos) y \s. un carácter de puntuación. A diferencia de otros programas, Emacs no interpreta \s como un espacio, para eso está \s-.
  • También tenemos clases sintácticas que se usan entre corchetes (adicionales a los que ya llevan) como [:digit:] para los números y [:alnum:] para los caracteres alfanuméricos. Una cosa a tener en cuenta es que estas clases varían según el modo.

  • Hay marcadores de borde, por ejemplo, \b indica el borde de palabra, y ^ y $ el inicio y el fin de línea respectivamente.

  • Podemos capturar grupos con \(CAPTURA\) para después hacer referencia a ellos con \N, donde N es un número que indica su posición. Por ejemplo, si hacemos \([[:digit:]]+\) capturaremos en la variable \1 una tira de números seguidos.

Seguir leyendo →