Regexp con ripetizioni
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”.
Nelle espressioni regolari, il simbolo di asterisco (“*“) significa “zero o piu’più ”, facendo riferimento al carattere subito prima:
rgx=>>/sas/rgx= /sa*s/ =>/sas/ ‘sas’/sa*s/ >> 'sas' =~ rgx=> 0‘saas’>> 'saas' =~ rgx=> 0‘saaas’>> 'saaas' =~ rgx=> 0‘ss’>> 'ss' =~ rgx=> 0
notate 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:
>>Immaginate cosa succede usando un punto ed un asterisco:rgx=rgx=/s.//s./ =>/s.//s./ >>‘ss’'ss' =~ rgx => 0 >>’s's’' =~ rgx => 0 >>’s#’'s#' =~ rgx => 0 >>’s’'s' =~ rgx => nil
>>facilissimo. Un altro metecarattere che esprime un certo numero di rpetizione e’ il punto interrogativo (“rgx=rgx=/s.o//s.*o/ =>/s.o//s.*o/ >>“sesso”"sesso" =~ rgx => 0 >>“sasso”"sasso" =~ rgx => 0 >>“sono"sonoio”io" =~ rgx => 0 >>“s"so”o" =~ rgx => 0 >>“s"s”" =~ rgx => nil
?“), che significa “o una o zero ripetizioni”:
>>Infine, la ripetizione che indica “uno o piu’ ” , in pratica invece di scrivere.rgx=rgx=/s.?o//s.?o/ # una s, una ripetizone o zero di un carattere qualsiasi e una o =>/s.?o//s.?o/ >>‘sio’=~'sio'=~ rgx => 0 >>‘so’=~'so'=~ rgx => 0 >>‘saao’=~'saao'=~ rgx => nil
scriveremo?*<carattere>?<carattere>*
Esempio:+<carattere>+
>>Un altro modo per usare le ripetizioni e’ dichiarare esplicitamente nellargx=rgx=/s.+o//s.+o/ # una s, uno opiu’piu' caratteri qualsiasi e una o =>/s.+o//s.+o/ >>‘so’=~'so'=~ rgx => nil >>‘sao’=~'sao'=~ rgx => 0 >>‘sono'sonoio’=~io'=~ rgx => 0 >>‘sono'sonoio’=~io'=~ rgx
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:
>>Inoltre, invece di scriverergx=rgx=/a{1,2}//a{1,2}/ =>/a{1,2}//a{1,2}/ >>‘ciao’'ciao' =~ rgx => 2 >>‘ciaao’'ciaao' =~ rgx => 2 >>‘cio’'cio' =~ rgx => nil
{n,n} potete scrivere solo {n. Ad esempio:
>>rgx=rgx=/a{2}//a{2}/ =>/a{2}//a{2}/ >>‘ciaao’'ciaao' =~ rgx => 2 >>‘ciao’'ciao' =~ rgx => nil