Il difficile arte delle espressioni regolari

La sfida è, in un documento Writer, trovare numeri tra 0 e 50 (compressi) ma non maggiori. Dovremo utilizzare espressioni regolari.

L’espressione

\b\d\b

troverà numeri di un digito tra 0 e 9. L’espressione

\b\d{1,2}\b

troverà numeri di uno o due digiti, dallo 0 fino al 99… sempre che non ci sia un carattere non numerico attaccato. Per esempio non troverà il numero in a29. Se doviamo trovare anche i numeri al interno di espressioni come a29 dovremo utilizzare alcune condizioni con le «look-ahead» e «Look-behind assertions» più la condizione logica «o» che si ottiene con la barra verticale. Qualcosa così

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

Quest’espressione cerca uno o due digiti che si trovino tra qualcosa che non sia ne un digito ne un inizio di paragrafo e un altra cosa che non sia un digito ne un finale di paragrafo.

Quasi ci siamo. Per limitare i numeri dovremo applicare qualche «selezione» in più:

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

Quest’espressione cerca tra 1 e 59, ma non 60 o più grande.

Guardate l’espressione definitiva:

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

Lascio al lettore il compito d’interpretare l’espressione. Un ripasso al capitolo sulle espressioni regolari del mio libro su Writer può aiutare…


Questo interessante esercizio di espressioni regolari è stato presentato prima nella versione italiana di ask.libreoffice. Ci ho messo un bel po’ a risolverlo… e ancora di più a ricordarmi di lasciarlo per scritto nel blog. Ma qui ci siamo!

Annunci