Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Corso su Ruby: espressioni regolari (2/2)
Scritto da Satish Talim il 10-09-2007 ore 10:28
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:
  1. <span style="font-size:1.0em">
  2. /a/.match("b")
  3. # 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:
  1. <span style="font-size:1.0em">
  2. string = "Il mio numero di telefono è (123) 555-1234."
  3. phone_re = /((d{3}))s+(d{3})-(d{4})/
  4. m = phone_re.match(string)
  5. unless m
  6.       puts "Non ci sono visualizzazioni..."
  7.       exit
  8. end
  9. print "L'intera stringa inizia con: "
  10. puts m.string
  11. print "L'intera parte della stringa che viene visualizzata: "
  12. puts m[0]
  13. puts "The three captures: "
  14. 3.times do |index|
  15.       puts "Capture ##{index + 1}: #{m.captures[index]}"
  16. end
  17. puts "Ecco un altro modo per prendere il primo blocco:"
  18. print "Capture #1: "
  19. 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:
  1. <span style="font-size:1.0em">
  2. >ruby p064regexp.rb
  3. L'intera stringa inizia con: Il mio numero di telefono è (123) 555-1234.
  4. L'intera stringa visualizzata: (123) 555-1234
  5. I tre blocchi:
  6. Capture #1: 123
  7. Capture #2: 555
  8. Capture #3: 1234
  9. Ecco un altro modo per prendere il primo blocco:
  10. Capture #1: 123
  11. >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"
Precedente: UML e Design Pattern
Successiva: Il Registry di Windows è stata una buona idea?
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.316 secondi.