Per ricercare qualsiasi numero si può usare:
/ [ 0 - 9 ] /, ma si può raggiungere la stessa cosa e più brevemente con il carattere di escape:
/ d / Due altre sequenze con
escape per classi di caratteri predefiniti sono:
- w mostra qualsiasi carattere alfabetico o underscore (_);
- s qualsiasi spazio bianco (spazio, tabulazione, nuova linea).
Si può comparare qualsiasi carattere che non è un numero solo scrivendo questi caratteri:
/ D /; similmente,
W mostra qualsiasi carattere oltre ai caratteri alfanumerici o all'underscore, ed
S mostra i caratteri che non sono spazi bianchi. Una comparazione che va a buon fine può ritornare un oggetto
MatchData. Ogni operazione di comparazione può andare a buon fine o fallire. Consideriamo l'esempio più semplice: il fallimento. Quando si vuole comparare una stringa in un pattern e la stringa non viene ritrovata, il risultato è sempre
nil:
<span style="font-size:1.0em">
/a/.match("b")# nil</span>
Questo
nil indica nessuna risposta o
false quando la comparazione viene trattata come un test
true/false. Diversamente da
niel, l'oggetto
MatchData ritorna un valore booleano, che indica se il pattern ha o meno corrispondenze nella stringa. Inoltre, conserva informazioni circa le ricerche, che possono essere richiamate con i metodi appropriati: dove le visualizzazioni iniziano (a quale carattere nella stringa), quante stringhe sono coperte, e così via.
Per usare oggetti
MatchData, è necessario per prima cosa salvare l'oggetto. Si consideri ad esempio di voler estrapolare un numero telefonico da una stringa e salvare le varie parti (codice nazionale, identificativo provinciale, numero) in gruppi separati. Ecco un esempio
p064regexp.rb:
<span style="font-size:1.0em">
string = "Il mio numero di telefono è (123) 555-1234."
phone_re = /((d{3}))s+(d{3})-(d{4})/m = phone_re.match(string)
unless m
puts "Non ci sono visualizzazioni..."
exit
end
print "L'intera stringa inizia con: "
puts m.string
print "L'intera parte della stringa che viene visualizzata: "
puts m[0]
puts "The three captures: "
3.times do |index|
puts "Capture ##{index + 1}: #{m.captures[index]}"end
puts "Ecco un altro modo per prendere il primo blocco:"
print "Capture #1: "
puts m[1]</span>
In questo codice, viene usato il metodo di stringa di
MatchData (
puts m.string) per ottenere l'intera stringa su cui l'operazione di confronto è realizzato. Per ottenere la parte della stringa corrispondente al pattern ricercato, si indirizza l'oggetto
MatchData utilizzando le parentesi quadre
[], con un indice posto a
0 (
puts m[0]). Si può utilizzare anche il metodo
Times per iterare esattamente
n volte il blocco di codice (
3.times do |index|) e stampare i risultati (i blocchi corrispondenti).
All'interno di questi blocchi di codice, un metodo chiamato
captures pesca le sottostringhe corrispondenti al pattern confrontato. Infine, si può utilizzare una tecnica differente, indicizzando direttamente l'oggetto
MatchData e utilizzando le parentesi quadre e interi positivi, ad ogni intero corrisponderà un blocco. Ecco l'output:
<span style="font-size:1.0em">
>ruby p064regexp.rb
L'intera stringa inizia con: Il mio numero di telefono è (123) 555-1234.
L'intera stringa visualizzata: (123) 555-1234
I tre blocchi:
Capture #1: 123
Capture #2: 555
Capture #3: 1234
Ecco un altro modo per prendere il primo blocco:
Capture #1: 123
>Exit code: 0</span>
Un tutorial dettagliato sulle espressioni regolari è presente a questo
indirizzo.
"Traduzione e adattamento a cura di Francesca Beatrice Cice. La versione originale del tutorial di Satish Talim può essere trovata su
rubylearning.com"