Escrito por Iván Alonso el Jueves 19 de Junio de 2008

Sigo con el tema con el que estaba el otro día, cambiando código obsoleto por cosas más legibles y/o más rápidas (aunque lo cierto es que las expresiones regulares pueden llegar a ser bastante poco legibles, especialmente si no estás acostumbrado a utilizarlas (o, como yo, no te acuerdas)).

Para normalizar un montón de textos, aplicamos algunos patrones para eliminar los molestos símbolos en los que se transforman las Ñ’s en otros sistemas de software, por ejemplo almohadillas, diéresis, el símbolo del yen, etc.


// Sustituimos  símbolo raro + vocal
// por "Ñ" + vocal
// Simbolo raro = {blackslash, almohadilla, yen, dieresis}
salida = Regex.Replace(salida, @"[#\\¥¨](?<vocal>[AEIOU])", "Ñ${vocal}");

Una aparición de los símbolos (doble barra invertida para escapar el carácter), seguido de una vocal, lo cambiamos por una Ñ seguida de la misma vocal. La ‘memoria’ antes y después de la aplicación de la expresión regular se consigue con la utilización de ?<nombre> en el patrón de reconocimiento y ${nombre} en el patrón de salida.

Una cosa interesante es que realmente estamos escapando el símbolo de la barra invertida dos veces, una al duplicarla y otra al comenzar el string con una arroba. Así lo escapamos en el entorno de programación y lo volvemos a escapar cuando la cadena llega al motor de expresiones regulares. Esto es lo que me llevó algo más de tiempo para darme cuenta, el resto se solucionó con una rápida petición de ayuda por Messenger a S., que ya me ha estado echando una mano con un par de dudas relacionadas con los css de esta web.

Etiquetas: , ,

Esta entrada fue escrita el Jueves 19 de Junio de 2008 a las 4:11 pm y está archivada en la categoría Blog. Puedes seguir las respuestas y comentarios en el feed RSS 2.0. Puedes dejar un comentario, o dejar un trackback desde tu propia página.

2 comentarios en “Más expresiones regulares”

  1. S pasó por aquí el Domingo 22 de Junio de 2008 a las 6:41 pm, y escribió:

    Hola Iván,
    Me gustaría apuntar un par de detalles que se me olvidaron cuando te presté ayuda.

    En primer lugar, decirte que la siguiente expresión es equivalente a la que tú citas en tu post:
    salida = Regex.Replace(salida, @”[#\\¥¨]([AEIOU])”, “Ñ$1”);

    De esta forma podemos deducir que los paréntesis por sí solos realizan una captura que después puede ser obtenida en la cadena de salida con $n, donde n es el índice con base 1 de la aparición del par de paréntesis (1 para el primer par, 2 para el segundo par si existiera, etc.).

    Por otro lado, si simplemente queremos hacer referencia a un par de paréntesis para agrupar y que no se tengan en cuenta como captura, usamos la sintaxis (?: … ).

    Por cierto, no está demás decir que esto es el comportamiento estándar, pero se puede modificar mediante distintas opciones en el constructor de la clase Regex.

  2. Uhmmm, me lo apunto, muchas gracias por la aclaración.

    PD: Tenía activado que todos los comentarios pasaran por moderacion (creo) a ver si ahora lo reconfiguro :)

Deja tu comentario