2010-08-28 7 views
47

In altre lingue regexp è possibile utilizzare // g per una corrispondenza globale.Ruby global match regexp?

Tuttavia, in Ruby:

"hello hello".match /(hello)/ 

una cattura solo ciao

Come faccio a catturare tutto ciao?

risposta

61

È possibile utilizzare il metodo di scansione. Il metodo di scansione ti darà una matrice di tutte le partite o, se passi un blocco, passa ogni partita al blocco.

"hello1 hello2".scan(/(hello\d+)/) # => [["hello1"], ["hello2"]] 

"hello1 hello2".scan(/(hello\d+)/).each do|m| 
    puts m 
end 

Ho scritto su questo metodo, è possibile leggere su di esso here vicino alla fine di questo articolo.

+5

Non c'è bisogno di fare 'ciascuno'. Proprio '.scan (...) {| m | ...}' – Nakilon

+2

Grande; un puntatore aggiuntivo: se la tua espressione regolare deve essere solo catturata nel suo complesso (nessun sottogruppo), omettendo l'allegato '()' ti fornirà un array regolare e piatto. Se si specifica almeno 1 sottogruppo, si otterrà un array annidato (i cui subarray NON includono l'intera corrispondenza - solo il sottogruppo acquisisce). – mklement0

6

Ecco un consiglio per chiunque cerchi un modo per sostituire tutte le corrispondenze regolari con qualcos'altro.

Piuttosto che // flag // e un metodo di sostituzione come molti altri linguaggi, Ruby utilizza invece due metodi diversi.

# .sub — Replace the first 
"ABABA".sub(/B/, '') # AABA 

# .gsub — Replace all 
"ABABA".gsub(/B/, '') # AAA 
Problemi correlati