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á.

Anuncio publicitario

6 comentarios en “Más sobre el difícil arte de las expresiones regulares

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

Los comentarios están cerrados.