Espressioni Regolari Alternanza

Vedi tutte le pagine e le modifiche recenti o scarica i sorgenti nella pagina


Ok, questa parola probabilmente non avra’ senso per voi. Nemmeno per me ne ha, ma e’ l’unico modo in cui riesco a tradurre “alternation”.

Cosa sto cercando di dirvi? Niente di complesso, semplicemente che potete scrivere delle Regexp che accettino varie alternative:
 >> rgx= /ciao|bau|miao/
 => /ciao|bau|miao/
 >> 'ciao'=~ rgx
 => 0
 >> 'bau'=~ rgx
 => 0
 >> 'bao'=~ rgx
 => nil
 >> 'miao'=~ rgx
 => 0
 >> 'mao'=~ rgx
 => nil
il simbolo di pipe (“|“) rappresenta in molti linguaggi il connettore logico “or”. Dunque quella Regexp significa “ciao o bau o miao”. Notate che potete anche scrivere cose come questa:
 >> rgx= /(c|m)iao/
 => /(c|m)iao/
 >> 'miao'=~ rgx
 => 0
 >> 'ciao'=~ rgx
 => 0
 >> 'biao'=~ rgx
 => nil

che tradotta in linguaggio umano significa “c oppure m, e dopo iao. Le parentesi rappresentano anche il cosidetto group operator, cioe’ dicono a ruby di conservare il gruppo di caratteri che sorrispondono all’espressione tra parentesi, perche’ potremmo decidere di usarli.

Ad esempio, in questo caso ruby manterrebbe la lettera “c” o la “m”.

Ma dove vengono conservati questi dati sul match?

beh, se usiamo le espressioni regolari con uno stile ad oggetti:
 >> m=rgx.match 'ciao'
 => #<MatchData:0x27bc2e8>
 >> m[0]
 => "ciao" 
 >> m[1]
 => "c" 

come vedete, al posto zero troviamo l’intera stringa matchata, mentre all’uno semplicemente la sottosringa matchata dal primo gruppo, cioe’ quella contenuta nelle prime due parantesi.

Vediamo un altro esempio:
 >> rgx= /(c)(i)(ao)/
 => /(c)(i)(ao)/
 >> m=rgx.match 'ciao'
 => #<MatchData:0x2758538>
 >> m[1]
 => "c" 
 >> m[2]
 => "i" 
 >> m[3]
 => "ao" 
Questo meccanismo e’ anche molto simile a quello di python. Ruby dal canto suo, permette di usare le regexp anche in uno stile piu’; procedurale, che poi e’ ispirato a perl, sed, awk e tutti i linguaggi pii’ vecchi in cui sono state introdotte le espressioni regolari. In questo caso, i match vengono salvati in delle variabili speciali, che non non vediamo affatto, ma che sono gestite da ruby per noi:
 >>  'ciao' =~ rgx
 => 0
 >> $1
 => "c" 
 >> $2
 => "i" 
 >> $3
 => "ao" 

In pratica dobbiamo usare una variabile globale di nome dove numero indica il gruppo. Anche se questa sintassi vi sembra strana, ricordate che si tratta di quella adottata generalmente nell’ambito dell’uso delle regexp, anche se con qualche variante (ad esempio, in vbscript esiste RegExp.$1 RegExp.$2 e cosi’ via)

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