¿Cuál es la diferencia entre gsub y sub métodos para Ruby Strings?

111

He estado examinando la documentación de Stringhoy y vi el :submétodo, que nunca antes había notado. He estado usando :gsuby parece que son esencialmente lo mismo. ¿Alguien puede explicarme la diferencia? ¡Gracias!

Ryanmt
fuente
5
ruby-doc.org/core/classes/String.html
mu es demasiado corto

Respuestas:

208

Las gsiglas de global, como en reemplazar globalmente (todos):

En irb:

>> "hello".sub('l', '*')
=> "he*lo"
>> "hello".gsub('l', '*')
=> "he**o"
Ray Toal
fuente
13
Si. Entiendo ahora. En mi defensa, no creo que esto fuera muy obvio ... Hasta ahora, eso es.
Ryanmt
15
¡Estoy de acuerdo contigo en que no es obvio! Java los llama replacey replaceAll. Pero Ruby tiene sus raíces en Perl, que usa el gmodificador. Es solo una de esas cosas.
Ray Toal
1
Afortunadamente, ahora es obvio. Lo sabré en el futuro.
Ryanmt
Por cierto, subes mucho más rápido que gsub, hay un punto de referencia aquí github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu
Veo un comportamiento diferente a esto: ¿ A, sentence, separated, by, commas".gsub!(/(.*),(.*)/,"\\2 \\1") => " commas A, sentence, separated, by" Alguna idea de por qué gsub!solo parece encontrar / reemplazar solo la primera instancia cuando se usan grupos de expresiones regulares?
Bennett Talpers
31

La diferencia es que subsolo reemplaza la primera ocurrencia del patrón especificado, mientras gsubque lo hace para todas las ocurrencias (es decir, reemplaza globalmente).

Chris Bunch
fuente
10
Si hubiera respondido un minuto antes, tal vez 1020 repeticiones más hubieran sido suyas. :)
Andrew Grimm
3
value = "abc abc"
puts value                                # abc abc
# Sub replaces just the first instance.
value = value.sub("abc", "---")
puts value                                # --- abc
# Gsub replaces all instances.
value = value.gsub("abc", "---")
puts value                                # --- ---
deepak
fuente
-2

suby gsubrealizar el reemplazo de la primera y todas las coincidencias respectivamente.

sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,
    fixed = FALSE, useBytes = FALSE)

gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,
     fixed = FALSE, useBytes = FALSE)


sub("4", "8", "An Introduction to R Software Course will be of 4 weeks duration" )  
##"An Introduction to R Software Course will be of 8 weeks duration"

gsub("4", "8", "An Introduction to R Software Course will be of 4 weeks duration" )
##"An Introduction to R Software Course will be of 8 weeks duration"
HEMANTHKUMAR GADI
fuente