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?
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?
È 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.
utilizzare String#scan
. Restituirà una matrice di ogni partita, oppure puoi passare un blocco e verrà chiamato con ogni partita.
Tutti i dettagli a http://ruby-doc.org/core/classes/String.html#M000812
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
Non c'è bisogno di fare 'ciascuno'. Proprio '.scan (...) {| m | ...}' – Nakilon
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