C'è un modo rapido per trovare tutte le corrispondenze di un'espressione regolare in Ruby? Ho esaminato l'oggetto Regex in Ruby STL e ho cercato su Google inutilmente.
Usare scan
dovrebbe fare il trucco:
string.scan(/regex/)
Per trovare tutte le stringhe corrispondenti, utilizzare scan
metodo della classe String
.
str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]
Se preferisci MatchData
che è il tipo dell'oggetto restituito da, match
metodo di Regexp
classi, usa il seguente
str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#<MatchData "54">, #<MatchData "3">, #<MatchData "1">, #<MatchData "7">, #<MatchData "3">, #<MatchData "36">, #<MatchData "0">]
Il vantaggio di avere MatchData
è che puoi usare metodi come offset
match_datas = str.to_enum(:scan, /\d+/).map { Regexp.last_match }
match_datas[0].offset(0)
#=> [2, 4]
match_datas[1].offset(0)
#=> [7, 8]
Fai anche queste domande se vuoi saperne di più
Come ottengo i dati della partita per tutte le occorrenze di un'espressione regolare Ruby in una stringa?
Enumeratore di espressioni regolari di Ruby che corrisponde al supporto di acquisizione denominato
Come trovare il punto di partenza per ogni partita in Ruby
Leggere le variabili speciali $&
, $'
, $1
, $2
in Ruby sarà super utile.
se hai un'espressione regolare con i gruppi:
str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/
Usa la scansione del metodo stringa per trovare i gruppi corrispondenti:
str.scan re
#> [["54"], ["1"], ["3"]]
Per trovare il modello di corrispondenza:
str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]