Espressioni Regolari

Mettiamo insieme un problema più interessante. Questa volta verificheremo se una stringa rientra in una certa descrizione , codificata in un preciso pattern (schema) .

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

[] specifica di un intervallo (ad.es., [a-z] siginifica una lettera tra a e z)
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 di intervallo)
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 carattere precedente
? al massimo una ripetizione del precedente; lo stesso che {0,1}
| Può corrispondere o l'espressione precedente o quella successiva
() raggruppamento

Iltermine comune per indicare i patternche usano questo strano vocabolario è espressioni regolari. In ruby, come in Perl, in genere esse sono racchiuse tra slash in avanti piuttosto che tra virgolette. Se non avete mai lavorato in precedenza con le espressioni regolari, probabilmente visembreranno tuttaltro che regolari , ma sarebbe saggio spendere del tempo per diventare familiari. Infatti esse hanno un potere espressivo notevole che vi risparmierà 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 stringa rientri in questa descrizione : "Inizia con una f minuscola, immediatamente seguita da da esattamente una lettera maiuscola, ed opzionalmente da altra immondizia, basta chenon ci siano altre lettere minuscole." Se siete dei 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 confrontare la vostra stringa con l'espressione regolare /^f[A-Z](^[a-z])*$/.

Che ne dite di "Contiene un numero esadecimale racchiuso tra 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
  nil
ruby> chab "Non questo."
  false
ruby> chab "Forse questo? {0x35}"    # tipo sbagliato di parentesi
  false
ruby> chab "O questo? <0x38z7e>"    # falsa cifra esadecimale
  false
ruby> chab "Okay, questo: <0xfc0004>."
  true

Anche se le espressioni regolari possono essere strane a prima vista, presto otterete soddisfazioni dal potervi esprimere in maniera così economica.

Qui c'è un piccolo programma per aiutarvi a sperimentare le espr4essioni regolari. Salvatelo come regx.rb ed eseguitelo scrivendo "ruby regx.rb" da riga di comando.

# Richiede un terminale ANSI !

st = "

Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Francesco
Hai dubbi su questo articolo?