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!


Antworten:


208

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

In irb:

>> "hello".sub('l', '*')
=> "he*lo"
>> "hello".gsub('l', '*')
=> "he**o"

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).


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                                # --- ---

-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"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.