Las expresiones regulares son patrones que mediante una secuencia de caracteres nos permiten realizar comparaciones de una porción de texto sobre otra mayor, de una forma muy potente y sin bucles. Cada vez que se presenta una ocurrencia del patron, podemos realizar una acción como por ejemplo reemplazar texto.
La sintaxis para definir patrones es extensa (ver más info ) y aqui sólo voy a tratar un ejemplo práctico para demostrar la potencia de estas expresiones.
El ejemplo viene de un script en C# que generé hace tiempo para una utilidad mas o menos curiosa como es la de obtener y separar las direcciones de email de cualquier texto, por muy «mezcladas» que estuvieran con otros caracteres. (lease, reenvios de emails).
Para empezar a usar expresiones regulares en .net debemos hacer uso del espacio de nombres RegularExpressions..de esta forma:
using System.Text.RegularExpressions;
Esto ya nos permitirá crear una instancia de la clase Regex y definir el patron que queramos. Como en este caso:
Regex reg = new Regex("[\]\[\(\),#;<>\t'\s]");
Estudiamos el patrón:
como vemos el primer y el último carácter dentro de las comillas son los corchetes, con ellos delimitamos patrones que pueden repetirse una o mas veces , es decir, quiero buscar en mi texto todos los caracteres que haya dentro de los corchetes y que se repitan x numero de veces
y todos esos caracteres, quiero, por ejemplo, eliminarlos o sustituirlos por otros. ¿porque quiero hacer esto? para obtener las direcciones de email y separarlas de la «paja».
Seguimos, con los siguientes 3 caracteres «\]» , aquí, estoy indicando que quiero localizar las ocurrencias del corchete de cierre…¿porque uso dos barras invertidas? bueno esto tiene dos detalles a tener en cuenta.
– El caracter «» se usa en expresiones regulares como caracter de escape, es decir, lo que haya despues de él, aún siendo un caracter especial, se considerara como simple caracter a buscar
– y porque dos veces? …porque en C# este caracter de escape hay que duplicarlo. En otros lenguages lo podeis incluir solo
Siguientes 3 caracteres, «\[» de nuevo aqui lo que busco es que me localice todas las ocurrencias del corchete de apertura
Siguientes 3 caracteres «\(» aqui quiero que me busque las ocurrencias del parentesis inicial
Siguientes 3 caracteres «\)» ….lo has acertado
siguiente 1 caracter es la «,» tambien quiero que me busque la coma en el texto y los demás «#;<>» de nuevo quiero que tambien me busque todas las ocurrencias de estos caracteres. Quiza os preguntaréis ¿y porque no usas la barra invertida como caracter de escape para estos caracteres? pues porque estos caracteres no forman parte de la sintaxis de las expresiones regulares y seran considerados por si mismos como caracteres a buscar…
Ahora tenemos «\t» …como sabemos el caracter t coincide con el tabulador, es decir, querría localizar los espacios en blanco correspondientes al tabulador y de nuevo uso dos barras por que lo exige el lenguage C#.
el penúltimo caracter a buscar es la comilla simple « ‘ » esta la dejamos tal cual sin caracter de escape, porque no forma parte de la sintaxis de las expresiones regulares.
y finalmente buscamos todos los espacios en blanco que haya en nuestro texto con este simple patron «\s» de nuevo con doble barra por ser C#.
bien, por último cerramos este patron con corchete, fijaos, sin usar el caracter de escape, pues si se usa aqui como sintaxis para indicar que esos caracteres pueden aparecer en nuestro texto una o mas veces.
y ahora que hacemos con esto…. pues decidir que hago con las ocurrencias que aparezcan..
Regex reg = new Regex("[\]\[\(\),#;<>\t'\s]");
String res = reg.Replace(cadena,",");
como vemos aqui la clase Regex nos permite ya usar la función Replace que lo que hará será sustituir cualquier ocurrencia del patron anterior por la coma, de esta forma tendremos un caracter de referencia que sabemos que sera el unico separador en nuestro bloque de texto para poder diferenciar lo que son direcciones de email (por supuesto no hemos puesto la @ pues si lo que buscamos son obtener direcciones de email de un texto ésta siempre debe manterse).
También podríamos haber usado esto
string[] res = reg.Split(",");
Lo que nos permitiría obtener un array de cadenas que podemos tratar posteriormente para diferenciar cuáles son direcciones de email y cuáles no…
con ésta otra función determinamos si una dirección de email es válida
public bool isValidEmail(string myEmail) {
bool isValidE;
isValidE = true;
Regex regEx = new Regex("^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$");
isValidE = regEx.IsMatch(myEmail);
return isValidE;
}
Espero que haya sido útil.
Si te apetece tener algunas funciones más, útiles tambien para el uso de expresiones regulares puedes dejar un comentario.
Deja una respuesta