Vamos a programar #64 - Expresiones regulares - Ejemplos (pt. 1).

Hola de nuevo a todos, el día de hoy vamos a continuar con las expresiones regulares.


En el post anterior vimos cuales son los caracteres que sirven para crear los patrones para las expresiones regulares, el día de hoy; y antes de pasar al código de VEncoder, vamos a ver cómo se usan con algunos ejemplos.
En esta ocasión voy a usar Notepad++ ya que soporta la búsqueda en el texto mediante expresiones regulares y los patrones no cambian tanto entre las que usemos aquí y las que usaremos en el código de C# (hay algunos cambios pero son mínimos). Para las palabras de prueba, copie la lista de las 1000 palabras básicas de Wikcionario, solo las pase a notepad++, pero puedes descargarlas de mi dropbox en un archivo de texto plano.

Con todo lo anterior, vamos a ver ejemplos. Supongamos que de la lista de palabras, solo queremos  buscar aquellas que comiencen con la letra "a". Para eso podemos crear un patrón cómo el que sigue:

\ba\w+\b

La expresión anterior buscará solo las palabras completas que comiencen con la letra "a", al buscar el patrón anterior en notepad++ y contar los resultados, tendremos algo cómo lo que sigue:

El patrón funciona de la siguiente manera:

  • \b - hace la búsqueda de "finales de palabra", puede ser puntos, nuevas lineas o cualquier símbolo que no se una letra.
  • a - es la letra a.
  • \w+ - indica que se vale cualquier carácter, el símbolo + indica que se puede repetir varias veces (no necesariamente la misma letra, sino el valor de carácter).
  • \b - hace la búsqueda de "finales de palabra", puede ser puntos, nuevas lineas o cualquier símbolo que no se una letra.
Cabe mencionar que solo se buscaran las palabras que exactamente comiencen con la letra "a" por lo que si en la lista están las palabras: Aburrido y aburrido; solamente se contará aburrido. Las expresiones regulares son sensibles a mayúsculas y minúsculas (dependiendo del motor de las expresiones regulares, se puede establecer un flag para ignorarlo, pero siempre es recomendable crear un patrón que sea preciso).

Ahora supongamos que ademas de que queremos buscar las palabras que empiezan con "a", queremos que solo cuente aquellas que también terminan con la letra "n". Podemos crear un patrón cómo el que sigue:

\ba\w+n\b

Cómo podrás ver  simplemente agregamos justo antes de "\b" una letra "n", al ejecutar la búsqueda en notepad++, veremos algo cómo lo que sigue:

En el idioma español, es muy poco común oír palabras con las letras x,y y z. Supongamos que queremos buscar todas las palabras que incluyan esas letras; podemos crear un patrón cómo el que sigue:

\b\w+[xyz]\w+\b

Al implementarlo, verás que palabras cómo arroz o zanahoria no las cuenta, esto se debe a que "\w+" indica que debe de haber alguna letra antes Y después de cualquiera de las letras que esta en el grupo (X, Y y Z) , podemos tratar de arreglarlo con la siguiente:

\b[xyz]\b

Pero lejos de acercarnos al resultado, lo empeora ya que el patrón anterior solo buscara exactamente cada letra que este en medio de dos corchetes, espacios en blanco o cualquier cosa que indique final de palabra.


 Para poder plantear un poco mejor que es lo que queremos buscar, podemos plantearlo de la siguiente manera: "busca palabras que contengan las letras X, Y o Z, sea al inicio o en medio o al final de la palabra". Aquí la clave es el comparador "o" en las expresiones regulares, hay patrones que sirven cómo un "or" lógico en programación, eso quiere decir que podemos definir mas de un patron de busqueda simultaneo. Ahora probemos con la siguiente expresión regular:

\b(\w+[xyz]|\w+[xyz]\w+|[xyz]\w+)\b

Al ejecutarlo veremos que palabras cómo "yegua" y "arroz" son encontradas. La explicación del patrón anterior es simple:
  • ( -inicio del grupo
    • \b - hace la búsqueda de "finales de palabra", puede ser puntos, nuevas lineas o cualquier símbolo que no se una letra.
    • \w+[xyz] - Buscará las palabras que tengan al final x, y o z.
    • | - Alternación, buscará el patrón que este antes o después.
    • \w+[xyz]\w+ - Buscará las palabras que tengan entre otras las letras x, y o z
    • | - Alternación, buscará el patrón que este antes o después.
    • [xyz]\w+ - Buscará las palabras que empiecen con x, y o z y que tengan más letras despues de estas.
    • \b - hace la búsqueda de "finales de palabra", puede ser puntos, nuevas lineas o cualquier símbolo que no se una letra.
  • ) - fin del grupo.
Con lo anterior, tendremos cómo resultado:

Otro caso es común, es buscar palabras con determinado número de letras, para este caso hay varias formas de hacerlo (incluso para la mayoría de los casos siempre hay mas de una forma de lograr el resultado). Supongamos que queremos listar todas las palabras que contienen exactamente 15 letras para eso disponemos de los siguiente patrones:

\b\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\b

o el siguiente

\b\w{15}\b

El segundo, es el mas optimo, hay que recordar que cuando se usan los corchetes, buscará de manera repetida el patrón que le antecede, el resultado:
Pero ademas se puede usar de tres maneras diferentes, la primera es la anterior, ahora supongamos para la segunda forma que queremos buscar todas las palabras que tengan diez o mas letras, podemos crear un patrón cómo el que sigue:

\b\w{10,}\b

El primer número indica que se deben de repetir en al menos diez veces el patron "\w", cómo no se indica el número maximo para las repeticiones, buscará todas las palabras sin importar el número de letras (a partir de 10). Al ejecutar la búsqueda, veremos algo cómo lo que sigue:

Ahora supongamos que solo queremos buscar las palabras que tengan de tres a cinco letras, podemos crear un patrón así:

\b\w{3,5}\b

Cuando usamos dos números entre los corchetes, indicaremos que queremos que busque tantas veces cómo el primer dígito lo indica, el patrón que le precede, pero ademas solo lo hará hasta el parámetro superior, en este caso solo se buscaran las palabras que contengan de tres a cinco letras, otro ejemplo de este, seria buscar palabras que tengan la misma letra o silaba repetida.

(co){2}

El ejemplo anterior solo encontrará la palabra cocodrilo, ya que se repite la silaba "co" dos veces.

Y bien, por ahora es todo, en el siguiente post continuaremos con mas ejemplos y después pasaremos a la parte que tiene que ver con VEncoder.

Los leo luego

No hay comentarios.