Expresiones regulares y editores de texto (II)

  4 mins read

Sigamos con nuestro capitulo acerca de expresiones regulares, si no has leido el anterior, deberías leerlo antes. Esta vez veremos como crearlas, al menos de forma básica para que simplemente leyendo esta entrada podamos construirlas. Pero antes de empezar me gustaría recomendaros unas utilidades para acelerar nuestro aprendizaje. ¡Más después del salto!

Utilidades relacionadas para crearlas rápidamente

Antes de empezar a crear nuestra primera regex vamos a elegir alguna utilidad que nos haga la vida más facil a a la hora de crear una expresion regular.

Referentes a la construcción de expresiones regulares:

  • Para cualquier plataforma: En adobe Air, Gskinner RegeExr Muy buena para empezar aunque se comporta algo lenta a veces, pero cumple su cometido y es gratis.
  • Para Mac: Patterns, disponible en el appstore a un precio de 3,99€. Personalmente es la que uso ya que es nativa, es sencilla de usar y tiene justo lo que necesito.
  • Para Windows: RegexBuddy, potente herramienta de gestión de regex, no solo te ayuda a construirlas sino que tiene un apartado que te explica cada componentes de los que construyes, quizá sea algo cara comparandola con el precio de la competencia, pero, si vale más es porque tiene muchas funcionalidades que el resto no tiene. Si usará windows o estuviera para mac seguro que la compraba.

Editores de texto potentes con regex incorporadas:
Una vez que cojamos algo de soltura con las regex, seguramente dejemos de usar las herramientas anteriores (a no ser que tengamos que construir alguna muy compleja), quizá sea ese el momento de usar un editor de texto que integre regex y no depender de estos programas. Mis recomendaciones:

  • Para windows
    • PSpad (gratuito) Muy potente editor de texto, para mi el mejor de todos.
    • Notepad++, muy bueno también quizá me gusta el PSpad más porque me parece más sencillo de usar.
  • Para Mac: TextWrangler (gratuito) Para mi el mejor editor para mac, aunque hecho de menos muchas veces a pspad por su potencia y todas sus opciones 🙁

Creando una regex

Ya tenemos las herramientas instaladas, ahora procederemos a la creación de una regex. Una regex no es más que una cadena de texto compuesta por uno o varios elementos que atrapan otras cadenas. para formar una regex deberemos entonces comprender cada elemento que puede formar una regex. Básicamente los dividiremos en 2 grupos, los que encuentran caracteres y los que definen comportamientos especiales para la regex o un subconjunto de caracteres dentro de la misma. Ambos los podemos combinar, por ejemplo si queremos capturar 2 dígitos seguidos podríamos poner d y juntarlo con alguno de repetición. A continuación los elementos más básicos:

Elementos que definen comportamientos especiales

Caracter Descripción Ejemplo Captura del ejemplo
^ Comienzo de la cadena, si ponemos este caracter delante de nuestra regex, indicaremos que la cadena que captura tiene que ser el siguiente caracter ^hola hola, holaquetal, hola123
$ Fin de string, al poner este caracter decimos que aquí es donde tiene que terminar de capturar hola$ hola, quetalhola, 123hola
? Indicamos que lo que precede al caracter puede o no estar en el texto hola? hola, hol, 123hola, 123hol
* lo que prece se puede repetir de 0 a N veces. hola* hola, hol, holaaaaaaaaa
+ lo que prece se puede repetir de 1 a N veces. hola+ holaaa, holaaaaaaaaa
( ___ ) Grupo de captura, indicamos que lo que hay dentro de los parentesis es un grupo, con estos grupos podemos trabajar más tarde. También sirve para usar los otros caracteres de captura en todo el grupo. ho(la)? hola, ho, laho, lahola
{ _,_ } Set de repeticiones, se repetira las veces que nosotros le digamos, se puede especificar de 2 formas, {2} en este caso se tiene que repetir 2 veces y {1,2} esta le indica que puede ser de 1 a 2 repeticiones hola{1,2} hola, holaa
[ ___ ] Set de caracteres, le indicamos que tiene que encontrar el set establecido. Podemos usar [pP] que encontraría cualquier p o P o algunos predefinidos [0-9], cualquier numero y [a-z] cualquier letra. Se permiten establecerse con repeticiones ho[lL]a hola, hoLa
| OR, se le especifica cuando puede ser una cosa u otra. ho(a|l|o)a hola, hoaa, hooa

Elementos que capturan texto

Caracter Descripción Ejemplo Captura del ejemplo
. Comodín, encaja con cualquier caracter ho.a hola, hoLa, hoSa, ho9a
d Cualquier dígito. d 0,1,2…
w Letras, barras bajas y números. w* hola, h1_Sa, ho9a
s Espacios, tabulaciones o saltos de línea. s* ho la

Estos son solo los más básicos, podemos encontrar más consultando la documentación en nuestro editor de texto o lenguaje de programación, pero, con los que he añadido en las tablas anteriores deberíamos de poder hacer todo lo que queramos. Ahora que ya sabemos todos los símbolos os recomiendo unos ejercicios para poneos vosotros mismos a prueba (podeis mirar la tabla de arriba :P).

Match Descripción Solución (spoiler)
DNI Con en formato: 00000000-F d{8}-[A-Z]
Dirección IP Captura de una dirección ip con un posible formato: 0.000.00.0, es decir, limitaremos a 3 dígitos y no comprobaremos los rangos de las ips. d{1,3}.d{1,3}.d{1,3}.d{1,3}

Encuentra tu forma de trabajo

Una vez hayamos hecho nuestras primera regex sería bueno encontrar nuestro estilo. Es decir, encontrar agrupaciones que nos hagan la vida más fácil o definirnos comportamientos. Por ejemplo, una de las regex que más suelo incorporar para acabar rápidamente es:
[box]
[^CARACTER A BUSCAR]*
[/box]
El significado literal que le doy es: “Captúrame cualquier cosa hasta que llegues al caracter a buscar que te he dicho”. Me resulta realmente útil en regex que tengan que capturar texto que este muy desplazado. Por ejemplo, si tenemos el texto:

[box]

HOLA SOY UN TEXTO HOLA SOY UN TEXTO HOLA SOY UN TEXTO HOLA SOY UN TEXTO QUIERO CAPTURAR ESTE TEXTO HOLA SOY UN TEXTO HOLA SOY UN TEXTO

[/box]

Y queremos capturar el texto “QUIERO CAPTURAR ESTE TEXTO” podríamos usar la siguiente regex:

[box]

[^”]*”capturar”>([^<]*)

[/box]

Como podeis ver, primero capturo el tr que es la parte fácil y luego me apoyo en las comillas para ir directamente al texto que me interesa y pasar por alto el resto del texto. cada uno usa las regex de la forma que le sea más sencilla trabajar, por eso es bueno buscar “trucos” como este para acelerar el aprendizaje.

Y hasta aquí la formación de regex. En el próximo capitulo veremos las regex usadas en código Java para Android.

Cualquier duda la podeis comentar en esta misma entrada, intentaré ayudaros en la medida de lo posible ;).

Written by:

Christian Panadero Martinez

  • Pingback: Expresiones regulares y editores de texto (I) | Baking Code()

  • Abel

    Muy fácil de entender y muy bien explicado! Olé!

    • Me alegro que te guste Abel, en la próxima entrega ya las aplicaremos a código. Si me da tiempo pongo un trocito de PHP 😉

      • Keep on wrtinig and chugging away!

    • I saerhced a bunch of sites and this was the best.

  • Gee wllieikrs, that’s such a great post!

  • laramjo

    Hola… `Gracias por este tipo de cosas en la web son muy util. Me gustaria por favor me ayudaran conesto.

    tengo
    texto texto cualquier texto cualquier texto cualquier texto cualquier texto cualquier texto cualquier texto cualquier texto cualquier texto TEXTO-TEXTO 1texto texto cualquier texto cualquier texto cualquier texto cualquier texto cualquier texto cualquier texto cualquier texto cualquier texto cualquier texto cualquier texto cualquier texto cualquier texto cualquier texto cualquier textoTEXTO-TEXTO 2
    me gustaria dejar solo
    TEXTO-TEXTO

    Gracias de ante amno. Intente hacelo como lo dices pero nada… Agradezco su ayuda

    Lo que me gustaria hacer es