Espressioni Regolari

Mettiamo insieme un problema più interessante. Questavolta verificheremo se una stringa rientra in una certadescrizione , codificata in un preciso pattern(schema) .

Ci sono alcuni caratteri e combinazioni di caratteri chehanno un significato speciale in questi pattern, tra cui:

[] specifica di un intervallo (ad.es., [a-z]siginifica una lettera tra a ez)
w lettera o cifra numerica; lo stesso che[0-9A-Za-z]
W ne' lettera ne' cifra
s carattere spazio; lo stesso che [ f]
S carattere non spazio
d cifra numerica; lo stesso che [0-9]
D carattere non numerico
backspace (0x08) (solo in una specifica di intervallo)
limite di parola (se non si trova in una specifica diintervallo)
B non limite di parola
* zero o più ripetizioni del carattere precedente
+ una o più ripetizioni del carattere precedente
{m,n} almeno m e massimo n ripetizioni del carattereprecedente
? al massimo una ripetizione del precedente; lo stessoche {0,1}
| Può corrispondere o l'espressione precedenteo quella successiva
() raggruppamento

Iltermine comune per indicare i patternche usano questostrano vocabolario è espressioni regolari. Inruby, come in Perl, in genere esse sono racchiuse tra slashin avanti piuttosto che tra virgolette. Se non avete mailavorato in precedenza con le espressioni regolari,probabilmente visembreranno tuttaltro che regolari , ma sarebbesaggio spendere del tempo per diventare familiari. Infattiesse hanno un potere espressivo notevole che virisparmierà mal di testa (e molte linee di codice)quando avrete bisogno di effettuare pattern matching,ricerca, o altre manipolazioni di stringhe di testo.

Ad esempio, supponiamo di voler verificare che una stringarientri in questa descrizione : "Inizia con una fminuscola, immediatamente seguita da da esattamente unalettera maiuscola, ed opzionalmente da altra immondizia,basta chenon ci siano altre lettere minuscole." Se sietedei programmatori C esperti, probabilmente avete giàuna dozzina di linee di codice in testa vero ? Ammettelo; nonè facile. Ma in ruby avete solo bisogno di confrontarela vostra stringa con l'espressione regolare/^f[A-Z](^[a-z])*$/.

Che ne dite di "Contiene un numero esadecimale racchiusotra parentesi angolari"? Nessun problema.

ruby> def chab(s)   # "contiene un numero esadecimale tra parentesi strette"    |    (s =~ /<0(x|X)(d|[a-f]|[A-F])+ >/) != nil    | end  nilruby> chab "Non questo."  falseruby> chab "Forse questo? {0x35}"    # tipo sbagliato di parentesi  falseruby> chab "O questo? <0x38z7e>"    # falsa cifra esadecimale  falseruby> chab "Okay, questo: <0xfc0004>."  true

Anche se le espressioni regolari possono essere strane aprima vista, presto otterete soddisfazioni dal poterviesprimere in maniera così economica.

Qui c'è un piccolo programma per aiutarvi asperimentare le espr4essioni regolari. Salvatelo comeregx.rb ed eseguitelo scrivendo "rubyregx.rb" da riga di comando.

# Richiede un terminale ANSI !

st = "



Ti potrebbe interessare anche

commenta la notizia