it-swarm-pt.tech

Corresponder todas as ocorrências de um regex

Existe uma maneira rápida de encontrar cada correspondência de uma expressão regular em Ruby? Eu olhei através do objeto Regex no Ruby STL e procurei no Google sem sucesso.

558
Chris Bunch

Usando scan deve fazer o truque:

string.scan(/regex/)
787
Jean

Para encontrar todas as strings correspondentes, use o método scan da classe String.

str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]

Se você preferir que MatchData que é o tipo do objeto retornado pelo método match de Regexp classs, use o seguinte

str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#<MatchData "54">, #<MatchData "3">, #<MatchData "1">, #<MatchData "7">, #<MatchData "3">, #<MatchData "36">, #<MatchData "0">]

O benefício de ter MatchData é que você pode usar métodos como 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]

Consulte estas perguntas também se quiser saber mais
Como obtenho os dados de correspondência para todas as ocorrências de uma expressão regular Ruby em uma string?
enumerador de correspondência de expressão regular Ruby com suporte a captura nomeado
Como descobrir o ponto de partida para cada partida em Ruby

Ler sobre variáveis ​​especiais $&, $', $1, $2 em Ruby será super útil.

57
sudo bangbang

se você tem um regexp com grupos:

str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/

Você usa o método scan do string para encontrar grupos correspondentes:

str.scan re
#> [["54"], ["1"], ["3"]]

Para encontrar o padrão de correspondência:

str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]
11
MVP