regular expressions examples ruby regex gsub

expressions - Ruby regex- ¿gsub almacena lo que coincide?



ruby regular expressions examples (3)

Si yo uso

.gsub(/matchthisregex/,"replace_with_this")

¿gsub almacena lo que coincide con la expresión regular en alguna parte? Me gustaría usar lo que coincida en mi cadena de reemplazo. Por ejemplo algo como

"replace_with_" + matchedregexstring + "this"

en mi ejemplo anterior, donde el matchedregexstring sería la coincidencia almacenada de gsub? Lo siento si eso fue confuso, no sé cómo decirlo.


Descubrí here que se podía acceder a las Regexp.last_match a través de la variable Regexp.last_match (clase MatchData ) de esta manera:

my_string.gsub(my_regexp){ Regexp.last_match.inspect }

Para dar un ejemplo más práctico, si desea registrar todas las coincidencias, se puede utilizar de la siguiente manera:

"Hello world".gsub(/(/w+)/) { Regexp.last_match.captures.each{ |match| Rails.logger.info "FOUND: #{match}"} } #Rails log: FOUND: Hello FOUND: world

En tu caso específico, podrías hacer algo como esto:

mystring.gsub(/(matchthisregex)/){ mystring = "replace_with_#{Regexp.last_match[0].to_s}this"}


Desde el fino manual :

Si el reemplazo es una String , se sustituirá por el texto coincidente. Puede contener referencias a los grupos de captura del patrón de la forma /d , donde d es un número de grupo, o /k<n> , donde n es un nombre de grupo. Si es una cadena entre comillas dobles, ambas referencias deben ir precedidas por una barra invertida adicional. Sin embargo, dentro del reemplazo, las variables de coincidencia especiales, como &$ , no se referirán a la coincidencia actual.
[...]
En la forma de bloque, la cadena de coincidencia actual se pasa como un parámetro, y las variables como $1 , $2 , $ `, $& y $'' se establecerán adecuadamente. El valor devuelto por el bloque se sustituirá por la coincidencia en cada llamada.

Si no le interesan los grupos de captura (es decir, cosas como (expr) en la expresión regular), puede utilizar el formulario de bloqueo y $& :

>> ''where is pancakes house?''.gsub(/is/) { "-#{$&}-" } => "where -is- pancakes house?"

Si tiene grupos de captura, puede usar /n en la cadena de reemplazo:

>> ''where is pancakes house?''.gsub(/(is)/, ''-/1-'') => "where -is- pancakes house?"

o $n en el bloque:

>> ''where is pancakes house?''.gsub(/(is)/) { "-#{$1}-" } => "where -is- pancakes house?"


Para todas las versiones de ruby: forma sencilla de obtener una cadena coincidente.

.gsub(/matched_sym/) {|sym| "-#{sym}-"}