it-swarm-es.tech

Unir todas las apariciones de una expresión regular

¿Hay una manera rápida de encontrar todas las coincidencias de una expresión regular en Ruby? He buscado en el objeto Regex en Ruby STL y busqué en Google sin éxito.

557
Chris Bunch

Usar scan debería hacer el truco:

string.scan(/regex/)
784
Jean

Para encontrar todas las cadenas coincidentes, use scan method of String class.

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

Si prefiere que MatchData sea el tipo de objeto devuelto por el método match de Regexp classs, use lo siguiente

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

El beneficio de tener MatchData es que puedes 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]

Consulta estas preguntas también si quieres saber más.
¿Cómo obtengo los datos de coincidencia para todas las apariciones de una expresión regular de Ruby en una cadena?
Enumerador de coincidencia de expresiones regulares de Ruby con compatibilidad de captura nombrada
Cómo averiguar el punto de partida para cada partida en Ruby

Leer sobre variables especiales $&, $', $1, $2 en Ruby será muy útil.

57
sudo bangbang

si tienes una expresión regular con grupos:

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

Utiliza el método de escaneo de cadenas para encontrar grupos coincidentes:

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

Para encontrar el patrón a juego:

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