Le espressioni regolari sono una cosa stupenda, la ragione 1007 per cui mi piace ruby è che le Regexp sono oggetti di prima classe nel linguaggio. Non che non ci siano ragioni per cui sia preferibile averle in una libreria, solo che io preferisco una comoda sintassi.
Ma sto divagando.

Purtroppo la maggior parte delle persone (io incluso) approcciano le espressioni regolari con una visione “ad esempi” senza capire i meccanismi sottostanti.
Ora, non mi pare il caso di fare una discussione su automi a stati finiti deterministici o meno, su come avere il backtracking possa influenzare drammaticamente le prestazioni di un regexp engine o sul perché le espressioni regolari in perl siano turing complete, tanto ci sono un fottio di documenti in rete a riguardo, e poi alla fine io mi confondo e non capisco e dico cavolate, specie di domenica sera.

Però volevo segnalare questo tool bellissimo che visualizza il funzionamento di un semplice sistema di regexp (forse un po’ troppo semplice, ma è fico).

Pensandoci, mi viene in mente anche una funzioncina utilissima presente nel paccheto regexp su rubyforge. In pratica l’autore stava sviluppando un suo motore scritto completamente in ruby, utile per un suo editor.
Uno degli effetti collaterali è stata la generazione di questa funzione utilissima che mostra il modo in cui viene vista una espressione regolare dal sistema:

>> require 'regexp'
=> true
>> rgx=/[cm]iao( mondo)?/
=> /[cm]iao( mondo)?/
>> puts rgx.tree
+-Sequence
  +-Inside set=[\"c\", \"m\"]
  +-Inside set=\"i\"
  +-Inside set=\"a\"
  +-Inside set=\"o\"
  +-Repeat greedy{0,1}
    +-Group capture=1
      +-Sequence
        +-Inside set=U-0020
        +-Inside set=\"m\"
        +-Inside set=\"o\"
        +-Inside set=\"n\"
        +-Inside set=\"d\"
        +-Inside set=\"o\"

fico, no?