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 delleRegexp 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 => nilil 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 RegExp.$1 RegExp.$2 e cosi’ via)