it-swarm-eu.dev

Abbina tutte le occorrenze di una regex

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.

558
Chris Bunch

Usare scan dovrebbe fare il trucco:

string.scan(/regex/)
787
Jean

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.

57
sudo bangbang

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"]
11
MVP