Espressioni Regolari Ripetizioni
Vedi tutte le pagine e le modifiche recenti o scarica i sorgenti nella pagina
Se avete usato almeno una volta una shell a riga di comando (sh, bash, command,com..) o anche un normale sistema di ricerca sul file system avrete usato quello che viene detto “globbing”, cioe’ quel meccanismo che vi permette di scrivere “*.txt” per intendere “tutti i file che hanno un qualunque nome ed un’estensione txt”.
*“) significa “zero o più ”, facendo riferimento al carattere subito prima:
>> rgx= /sa*s/ => /sa*s/ >> 'sas' =~ rgx => 0 >> 'saas' =~ rgx => 0 >> 'saaas' =~ rgx => 0 >> 'ss' =~ rgx => 0notate che abbiamo un match anche quando la “a” non appare. L’asterisco significa zero o piu’. Questo meccanismo diventa piu’ interessante usando un carattere speciale, o metacarattere, che rappresenta un carattere qualsiasi. Questo metecarattere e’ il punto (“
.“).
Il punto sara’ felice di riconoscersi in qualunque altro carattere, ammesso che un carattere ci sia:
>> rgx= /s./ => /s./ >> 'ss' =~ rgx => 0 >> 's ' =~ rgx => 0 >> 's#' =~ rgx => 0 >> 's' =~ rgx => nilImmaginate cosa succede usando un punto ed un asterisco:
>> rgx= /s.*o/ => /s.*o/ >> "sesso" =~ rgx => 0 >> "sasso" =~ rgx => 0 >> "sono io" =~ rgx => 0 >> "s o" =~ rgx => 0 >> "s " =~ rgx => nilfacilissimo. Un altro metecarattere che esprime un certo numero di rpetizione e’ il punto interrogativo (“
?“), che significa “o una o zero ripetizioni”:
>> rgx= /s.?o/ # una s, una ripetizone o zero di un carattere qualsiasi e una o => /s.?o/ >> 'sio'=~ rgx => 0 >> 'so'=~ rgx => 0 >> 'saao'=~ rgx => nilInfine, la ripetizione che indica “uno o piu’ ” , in pratica invece di scrivere.
<carattere>?<carattere>*scriveremo
<carattere>+Esempio:
>> rgx= /s.+o/ # una s, uno o piu' caratteri qualsiasi e una o => /s.+o/ >> 'so'=~ rgx => nil >> 'sao'=~ rgx => 0 >> 'sono io'=~ rgx => 0 >> 'sono io'=~ rgxUn altro modo per usare le ripetizioni e’ dichiarare esplicitamente nella
Regexp il numero.
Il meccanismo e’ semplice, basta usare una coppia di parentesi graffe, ed all’interno scrivere il numero minimo e massimo di match:
>> rgx= /a{1,2}/ => /a{1,2}/ >> 'ciao' =~ rgx => 2 >> 'ciaao' =~ rgx => 2 >> 'cio' =~ rgx => nilInoltre, invece di scrivere
{n,n} potete scrivere solo {n. Ad esempio:
>> rgx= /a{2}/ => /a{2}/ >> 'ciaao' =~ rgx => 2 >> 'ciao' =~ rgx => nil