Quelle est la différence entre les méthodes gsub et sub pour Ruby Strings

111

J'ai parcouru la documentation pour Stringaujourd'hui, et j'ai vu la :subméthode, que je n'avais jamais remarquée auparavant. J'utilise :gsubet il semble qu'ils sont essentiellement les mêmes. Quelqu'un peut-il m'expliquer la différence? Merci!

Ryanmt
la source

Réponses:

208

Le gsignifie global, comme dans replace globalement (all):

En irb:

>> "hello".sub('l', '*')
=> "he*lo"
>> "hello".gsub('l', '*')
=> "he**o"
Ray Toal
la source
13
Ouais. Je comprends maintenant. Pour ma défense, je ne pense pas que c'était très évident ... Jusqu'à présent, c'est vrai.
Ryanmt
15
Je suis d'accord avec vous que ce n'est pas évident! Java les appelle replaceet replaceAll. Mais Ruby a ses racines en Perl qui utilise le gmodificateur. C'est juste une de ces choses.
Ray Toal
1
Heureusement, c'est maintenant évident. Je le saurai dans le futur.
Ryanmt
Au fait, subc'est beaucoup plus rapide que gsub, il y a un benchmark ici github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu
Je vois un comportement différent à ceci: des A, sentence, separated, by, commas".gsub!(/(.*),(.*)/,"\\2 \\1") => " commas A, sentence, separated, by" pensées pourquoi gsub!ne semble trouver / remplacer que la première instance lors de l'utilisation de groupes de regex?
Bennett Talpers
31

La différence est que subne remplace que la première occurrence du modèle spécifié, alors gsubqu'il le fait pour toutes les occurrences (c'est-à-dire qu'il remplace globalement).

Chris Bunch
la source
10
Si vous aviez répondu une minute plus tôt, peut-être 1020 représentants de plus auraient été à vous. :)
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
la source
-2

subet gsubeffectuer le remplacement du premier et de tous les matches respectivement.

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
la source