Técnicas del Vietnam – Expresiones regulares.

¡Bienvenidos un día más a un nuevo rootie queridos amigos! Hoy por fin vuelvo a los mandos de ohmyroot! y lo hago inaugurando una nueva sub-categoría, en la que me he tomado la libertad de nombrarla Las Técnicas del Vietnam, como sabiamente las llamaba mi antiguo compañero y amigo Pablo «Maester» Gómez. Para estrenar esta fantástica categoría hoy vamos a hablar de una herramienta, que muchos programadores odian y que yo personalmente la usaría hasta para hacer la compra, hoy hablaremos de expresiones regulares.

cadena maester expresiones regulares
Con una de estas y un cuervo se paseaba por la oficina…

¿Qué son las expresiones regulares?

Lo primero que debemos hacer antes de meternos a ver que son, como siempre vamos a definirlas:

Las expresiones regulares también conocidas como regex, regexp es una secuencia de caracteres que forma un patrón de búsqueda, principalmente utilizada para la búsqueda de patrones de cadenas de caracteres u operaciones de sustituciones – Wikipedia

Como habréis deducido de esta (redundante) definición, las regex son para buscar en textos. ¡Pos vaya me diréis, para eso hago ctrl + F!» y los que penséis eso, no podréis estar más equivocados, así que colgar la llamada. Como bien apunta la definición, sirve para encontrar patrones, esto quiere decir que no necesariamente necesitamos saber lo que estamos buscando, si no simplemente la forma en que vamos a encontrarlo.

Creando expresiones regulares.

La implementación de expresiones regulares, difiere ligeramente en su implementación dependiendo del lenguaje, pero todas siguen ciertas reglas básicas. Las regex se pueden construir utilizando las siguientes operaciones:

  • Booleana «O» (OR): Se define con la barra vertical ( ) para separar alternativas. Por ejemplo padre | madre, coincidirá con ambos.
  • Agrupación: Los paréntesis se utilizan para definir el ámbito y la precedencia de los operadores (entre otros usos). Por ejemplo (p | m)adre es un patrón que coincidirá con padre y madre.
  • Cuantificación: Un cuantificador después de un token (como por ejemplo un carácter) o grupo especifica la frecuencia con la que esta puede ocurrir. Los más comunes con el interrogante ?, el asterisco * (derivado de la Clausura de Kleene) y el símbolo más +
? El interrogante indica cero o una coincidencia del elemento anterior. Por ejemplo, mucho?s coincidirá con «mucho» y «muchos».
* El asterisco indica ceromás coincidencias del elemento anterior. Por ejemplo ab*c coincidirá con: «ac», «abc», «abbc», «abbbc».
+ El símbolo del más indica una o más coincidencias del elemento anterior. Por ejemplo ab+c coincidirá con: «abc», «abbc», «abbbc», etc. pero no con «ac».
{n} El elemento anterior coincide n número de veces.
{min,} El elemento anterior coincide min número de veces.
{min,max} El elemento anterior coincide al menos min número de veces, pero no más de max número de veces.

Podemos combinar libremente todos estos constructores, para crear expresiones complejas, por ejemplo «H(ae?|ä)ndel» que equivale a «H(a|ae|ä)ndel». Como podemos ver, esto es realmente útil para encontrar patrones simples, pero no no permite realmente extraer el potencial de las expresiones regulares, para ello contamos con los metacaracteres.

Metacaracteres en las expresiones regulares.

Para extender la funcionalidad de las expresiones regulares, se utiliza un conjunto de símbolos, que pasados al motor de búsqueda no se interpretan literalmente, si no que amplían las condiciones necesarias para encontrar una coincidencia.

. Se interpreta por como «cualquier carácter». Muchas implementaciones excluyen el salto de linea.
[ ] Indicando caracteres entre los corchetes hará que coincida con cualquiera de los caracteres. Por ejemplo, [abc] encontrará «a», «b» o «c». Con los corchetes también podemos definir rangos usando un guión, [a-z] coincidirá cualquier letra minúscula de la «a» a la «z». Estas formas pueden ser combinadas: [abcx-z] encontrará «a», «b», «c».»x»,»y» o «z».
[^ ] Indicando caracteres entre los corchetes hará que coincida con cualquiera de los caracteres que no estén presentes.  Por ejemplo, [^abc] encontrará cualquier carácter que no sea «a», «b» o «c». [^a-z] coincidirá cualquier letra que no sea minúscula de la «a» a la «z».
^ Hace coincidir la posición de inicio de la cadena o linea.
$ Hace coincidir la posición final de la cadena o linea.
( ) El bloque o grupo de captura, define una subexpresión. La cadena encontrada entre los paréntesis puede ser llamada después. Especialmente útil para operaciones de reemplazo.

Utilizando expresiones regulares.

Una vez que ya hemos visto todos los elementos de las expresiones regulares, es cuando podemos ver los beneficios y la potencia de las mismas. Las expresiones regulares, pueden ser utilizadas tanto en la mayoría de los lenguajes de programación, así como en scripts de terminal (bash, etc.), lo que nos ofrece una buena herramienta para automatizar tareas repetitivas sin tener que recurrir a complicados y oscuras soluciones.

Ejemplos:

Como podéis ver, las expresiones regulares, nos permiten realizar de una manera más sencilla operaciones de búsqueda de una forma sencilla y directa. Además muchos lenguajes de programación permiten el encontrar textos y realizar diferentes operaciones en una sola operación.

Y con esto terminamos por hoy, espero que disfrutéis de este rootie y que podáis hacer uso de lo aquí comentado, ya que una vez que dominas las expresiones regulares, tu vida como experto en IT (da igual programador, sysadmin, devops, etc.) toma un matiz totalmente diferente, en el que vais a querer automatizar todo lo posible utilizando regex.

Para cualquier duda, pregunta, comentario, soborno o amenaza, podéis usar los comentarios o en nuestras redes sociales Facebook y Twitter.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *