Expresiones regulares y editores de texto (I)

  3 mins read

Este post va a ser uno de mis preferidos, ¡Me encantan las Regex! Me han salvado de muchos apuros en distintos momentos de mi vida como programador. ¿Cuantas veces hemos tenido que reemplazar los caracteres iniciales de una frase y estos eran variables? ¿Hemos sacado algún NSLog por pantalla con valores que luego tenemos que usar y nos hemos dado cuenta que sale la hora al principio de cada linea de la consola? ¡Este capitulo va de Regex! y de como hacerlas formar parte de nuestro trabajo.

Lo primero y más básico, ¿Que es una Regex?

Una expresión regular, patrón o Regex (como más nos gute llamarlo) es una forma de describir un conjunto de caracteres que tienen un comportamiento común, por ejemplo las cadena “101” y “102” tienen en común los 2 primeros digitos (“10”) Podríamos hacer una Regex para capturarlas, sería algo como esto: 10d+ En esta regex describimos “10” como parte fija acompañada de un digito o más que tienen que estar en la parte posterior.

Muy bien, las regex parecen interesantes, pero, ¿Qué podemos hacer con ellas?
El mundo de las expresiones regulares es muy amplio, pero, bajo mi opinion los usos más frecuentes son dos:

1. Encontrado texto

Con una regex podremos encontrar texto variable de una forma sencilla. Imaginemos un script sql con 20.000 lineas que contienen sentencias SQL (Da igual el orden, si tiene saltos de linea etc…) y queremos encontrar las Selects que no usan campos sino que usan la expresión “Select *….” La regex en este caso sería sencilla:

[box]
Selects**[^;]*;
[/box]

Con esta sencilla regex capturaríamos todas las “Select *” de un fichero, como veis son muy utiles y versatiles. Otro ejemplo, Tenemos un XML y solo nos interesa un tag, poniendo un ejemplo real, el kml que devuelve google maps haciendo una búsqueda sobre Valencia en esta URL Si queremos el tag “coordinates” usaríamos la siguiente regex:
[box]
<coordinates>s*(-?d+.d+)s*,s*(-?d+.d+)s*</coordinates>
[/box]

Con esta regex encontraremos todas las repeticiones del tag coordinates del fichero indicado.

2. Sustitución de texto

Siguiendo con los ejemplos anteriores, imaginaos que en el fichero SQL queremos eliminar las regex anteriormente señaladas. Sería tan simple como sustituir la regex anterior con la cadena “”. Otro ejemplo, si imprimimos en xcode el description de un NSArray, obtendremos el siguiente output:

[box]
2011-06-08 21:02:37.701 programa[57513:207] Array de filas capturadas:(
6,
6,
6,
6,
6,
7,
7,
………..
)
[/box]

Para que sean más legibles podríamos copiar ese output cualquier editor y reemplazar la siguiente regex:
[box]
,n
[/box]
por:
[box]
,
[/box]

De esta forma eliminaríamos los saltos de linea y podríamos ver el output en una linea que resulta más agradable. Un tercer ejemplo, un poco más avanzado es cuando creamos una regex, podemos especificar grupos de captura, estos nos permiten dividir cosas importantes dentro de la regex y después poder usarlos.

Por ejemplo, dado el siguiente texto:

[box]
<table>
<tr>
<td>hola</td><td>soy una tabla</td>
</tr>
</table>
[/box]

Describimos la siguiente regex:
[box]
<tr>s*(<td>[^<]*</td>s*)*</tr>
[/box]

Como veis, tiene entre parentesis una parte de la regex, eso que esta entre parentesis es lo que llamamos grupo de captura. Si en cualquier editor de texto que soporte regex sustituimos la regex por “<tr>$1$1$1$1</tr>” veremos que el resultado es el siguiente:

[box]
<table>
<tr><td>soy una tabla</td>
<td>soy una tabla</td>
<td>soy una tabla</td>
<td>soy una tabla</td>
</tr>
</table>
[/box]

¿Qué ha pasado? Pues que al especificarle que queremos reemplazar la regex por 4 repeticiones del grupo 1, nos ha duplicado el grupo tantas veces como le hemos dicho. Resumiendo, en una regex lo que este entre parentesis es un grupo y para referirnos a ese grupo usaremos $NUMERO_GRUPO. Hay algunos editores / lenguajes de programación que en vez de usar el $ usan el caracter “”, por ejemplo 1.

Como veis posibilidades hay muchas, lo único que necesitamos es aprender a usarlas para poder aprovecharlas en distintos momentos en nuestro desarrollo.

Continua leyendo el segundo capítulo aquí

Written by:

Christian Panadero Martinez

  • It’s much easier to uendrstnad when you put it that way!