Pregunta Haga coincidir todas las apariciones de una expresión regular


¿Hay una manera rápida de encontrar cada coincidencia de una expresión regular en Ruby? Revisé el objeto Regex en el Ruby STL y busqué en Google sin éxito.


517
2017-09-17 05:46


origen


Respuestas:


Utilizando scan debería hacer el truco:

string.scan(/regex/)

737
2017-09-17 05:53



Para encontrar todas las cadenas correspondientes, use scan método de String clase.

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

Si prefieres MatchData que es el tipo de objeto devuelto por match método de Regexp clases, use la 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]

Consulte estas preguntas también si desea saber más
¿Cómo obtengo los datos de coincidencia para todas las apariciones de una expresión regular de Ruby en una cadena?
Encuestador de concordancia de expresiones regulares de Ruby con soporte de captura nombrado
Cómo encontrar el punto de partida para cada partido en ruby 

Lectura sobre variables especiales $&, $', $1, $2 en ruby ​​será muy útil.


41
2018-03-12 22:42



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 cadena para encontrar grupos coincidentes:

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

Para encontrar el patrón de coincidencia:

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

6
2018-04-20 17:37