Was ist der Unterschied zwischen gsub- und sub-Methoden für Ruby Strings?

111

Ich habe die Dokumentation für Stringheute durchgesehen und die :subMethode gesehen, die ich noch nie bemerkt hatte. Ich habe verwendet :gsubund es scheint, dass sie im Wesentlichen gleich sind. Kann mir jemand den Unterschied erklären? Vielen Dank!

Ryanmt
quelle

Antworten:

208

Das gsteht für global, wie in global ersetzen (alle):

In irb:

>> "hello".sub('l', '*')
=> "he*lo"
>> "hello".gsub('l', '*')
=> "he**o"
Ray Toal
quelle
13
Ja. Ich verstehe jetzt. Zu meiner Verteidigung glaube ich nicht, dass dies sehr offensichtlich war ... Bis jetzt also.
Ryanmt
15
Ich stimme Ihnen zu, dass es nicht offensichtlich ist! Java nennt diese replaceund replaceAll. Aber Ruby hat seine Wurzeln in Perl, das den gModifikator verwendet. Es ist nur eines dieser Dinge.
Ray Toal
1
Zum Glück ist es jetzt offensichtlich. Ich werde es in Zukunft wissen.
Ryanmt
Übrigens subist viel schneller als gsub, es gibt hier einen Benchmark github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu
Ich sehe ein anderes Verhalten als dieses: A, sentence, separated, by, commas".gsub!(/(.*),(.*)/,"\\2 \\1") => " commas A, sentence, separated, by" Irgendwelche Gedanken, warum gsub!nur die erste Instanz zu finden / zu ersetzen scheint, wenn Regex-Gruppen verwendet werden?
Bennett Talpers
31

Der Unterschied besteht darin, dass subnur das erste Vorkommen des angegebenen Musters ersetzt wird, während gsubdies bei allen Vorkommen der Fall ist (dh es wird global ersetzt).

Chris Bunch
quelle
10
Wenn Sie eine Minute zuvor geantwortet hätten, wären vielleicht 1020 weitere Mitarbeiter Ihre gewesen. :)
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
quelle
-2

subund gsubersetzen Sie das erste bzw. alle Übereinstimmungen.

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
quelle