2011-11-03 7 views
34

Sono nuovo di Ruby e ho sempre utilizzato String.scan per cercare la prima occorrenza di un numero. È abbastanza strano che il valore restituito sia nell'array nidificato, ma io vado semplicemente a [0][0] per i valori che voglio. (Sono sicuro che abbia lo scopo, solo che non l'ho ancora usato.)Qual è la differenza tra scansione e corrispondenza sulla stringa di Ruby

Ho appena scoperto che esiste un metodo String.match. E sembra essere più conveniente perché l'array restituito non è nidificato.

Ecco un esempio dei due, prima IS Scan:

>> 'a 1-night stay'.scan(/(a)?(\d*)[- ]night/i).to_a 
=> [["a ", "1"]] 

poi è partita

>> 'a 1-night stay'.match(/(a)?(\d*)[- ]night/i).to_a 
=> ["a 1-night", "a ", "1"] 

ho controllare l'API, ma non posso davvero differenziare la differenza, come entrambi si riferivano a "abbinare il modello".

Questa domanda è, per semplice curiosità, su cosa può fare scanmatch e viceversa. Qualunque scenario specifico che solo uno può realizzare? match è inferiore a scan?

risposta

40

Risposta breve: scan restituirà tutte le partite. Questo non lo rende superiore, perché se vuoi solo la prima partita, str.match[2] legge molto più bello di str.scan[0][1].

ruby-1.9.2-p290 :002 > 'a 1-night stay, a 2-night stay'.scan(/(a)?(\d*)[- ]night/i).to_a 
=> [["a ", "1"], ["a ", "2"]] 
ruby-1.9.2-p290 :004 > 'a 1-night stay, a 2-night stay'.match(/(a)?(\d*)[- ]night/i).to_a 
=> ["a 1-night", "a ", "1"] 
17

#scan restituisce tutto ciò che la regex.

#match restituisce la prima partita come un oggetto MatchData, che contiene dati detenuti da variabili speciali come $& (ciò che è stato compensato dal Regex, che è ciò che è la mappatura di indice 0), $1 (partita 1), $2, et al.

Problemi correlati