input.gsub (números) {| m | p $ ~} Datos coincidentes en Ruby para todas las ocurrencias en una cadena

Respuesta de ¿Cómo obtengo los datos de coincidencia para todas las apariciones de una expresión regular de Ruby en una cadena? :

input = "abc12def34ghijklmno567pqrs" numbers = /\d+/ input.gsub(numbers) { |m| p $~ } 

El resultado es el solicitado:

 ⇒ # ⇒ # ⇒ # 

¿Alguien input.gsub(numbers) { |m| p $~ } lo que está haciendo el que responde en input.gsub(numbers) { |m| p $~ } input.gsub(numbers) { |m| p $~ } ?

Además, ¿cómo puedo acceder a cada uno de los MatchData s?

Ya que soy el que responde, trataría de explicar.

$~ es uno de los globales predefinidos de Ruby . Devuelve el MatchData de la coincidencia de patrón exitosa anterior . Se puede acceder usando Regexp.last_match también.

Como se indica en la documentación , gsub con bloque se usa comúnmente para modificar la cadena, pero aquí usamos el hecho de que llama al bloque de código en cada coincidencia. En la variable de bloque m hay una cadena simple para esa coincidencia, por lo tanto, si necesitamos la instancia de MatchData completa, deberíamos usar el $~ global predefinido. En el ejemplo mencionado, simplemente imprimimos cada MatchData con p $~ .

El truco aquí es que $~ devuelve el último MatchData . Por lo tanto, todo lo que necesita es usar la variable $~ pesar de su aspecto repulsivo. O bien, puede establecer:

 my_beauty_name_match_data_var = $~ 

y jugar con este último. Espero eso ayude.