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”.

Nelle espressioni regolari, il simbolo di asterisco (“*“) 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
 => 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:
 >> rgx= /s./
 => /s./
 >> 'ss' =~ rgx
 => 0
 >> 's ' =~ rgx
 => 0
 >> 's#' =~ rgx
 => 0 
 >> 's' =~ rgx
 => nil
Immaginate 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
 => nil
facilissimo. 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
 => nil
Infine, 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'=~ rgx
Un 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
 => nil
Inoltre, invece di scrivere {n,n} potete scrivere solo {n. Ad esempio:
 >> rgx= /a{2}/
 => /a{2}/
 >> 'ciaao' =~ rgx
 => 2
 >> 'ciao' =~ rgx
 => nil

Updated on November 26, 2005 13:07 by Ruby Fan (151.37.150.7)