Más sobre el difícil arte de las expresiones regulares

Esta vez va de números. Supongamos que queremos localizar en un documento Writer números entre 1 y 50, pero no mayores.

La expresión

\b\d\b

encontrará números de un solo dígito desde 0 a 9. La expresión

\b\d{1,2}\b

encontrará números de uno o dos dígitos, desde el 0 hasta el 99… siempre que no tenga una letra pegada. Por ejemplo no encontrará el número en a29. Si queremos localizar el número a toda costa necesitamos algunas condiciones con las «look-ahead» y «Look-behind assertions» más la condición lógica «o» que se consigue con la barra vertical. Algo así

(?<=[^\d]|^)\d{1,2}(?=[^\d]|$)

Lo que busca esta expresión es uno o dos dígitos que se encuentran entre algo que no es ni un dígito ni un inicio de párrafo y otra cosa que tampoco es un dígito o un final de párrafo.

Ya estamos más cerca. Para limitar el rango tendremos que aplicar un poco más de «selección»:

(?<=[^\d]|^)([1-5]?\d)(?=[^\d]|$)

ya busca entre 1 y 59, pero no 60 o mayores. ¡Ya estamos casi allí!

Contemplad ahora la expresión definitiva:

(?<=[^\d]|^)([1-4]?\d)(?=[^\d]|$)|50

Dejo como ejercicio para el lector el interpretar la expresión. Eso sí, es altamente aconsejable repasar el capítulo sobre expresiones regulares de mi libro antes de intentarlo.


Este interesante ejercicio de expresiones regulares se planteó hace unas semanas en la versión italiana de ask.libreoffice. Me llevó un buen rato el darme cuenta de cómo resolverlo… y aún más el recordar de dejarlo por escrito en el blog. Pero finalmente aquí está.

Anuncios

  1. #1 por El Mau el 19 octubre, 2017 - 21:17

    En lo único “esotérico” en que creo, en las expresiones regulares que son magia… ni soñando lo hubiera resuelto, muchas gracias como siempre por compartir.

    Un abrazo

    • #2 por elpinguinotolkiano el 19 octubre, 2017 - 21:37

      Últimamente he comenzado a pensar que un manual de expresiones regulares podría servir como base a un guión de película de terror XD

      Saludos

  2. #3 por nasciiboy el 19 octubre, 2017 - 21:52

    esa expresion es demasiado compleja, no utilizo libre office, pero probando con \b([1-4]\d|50)\b creo que el resultado es apropiado

    • #4 por elpinguinotolkiano el 19 octubre, 2017 - 21:57

      Esa expresión se saltea los números en cosas como «a29», pero es verdad, si no queremos buscar números «pegados» a letras es más simple.

      Saludos

  3. #5 por Ondiz el 19 octubre, 2017 - 22:20

    ¡Qué casualidad! Estoy escribiendo ahora mismo sobre expresiones regulares yo también, aunque eso sí en Emacs. Cómo me encantan 😀

Aquí puedes dejar un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: