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 = "