Jaka jest różnica między metodami gsub i sub w Ruby Strings

111

Przeglądałem Stringdzisiaj dokumentację i zobaczyłem :submetodę, której nigdy wcześniej nie zauważyłem. Używałem :gsubi wydaje się, że są one zasadniczo takie same. Czy ktoś może mi wyjaśnić różnicę? Dzięki!

Ryanmt
źródło
5
ruby-doc.org/core/classes/String.html
mu jest za krótkie.

Odpowiedzi:

208

gOznacza globalny, jak w wymieniać globalnie (wszystkie):

W irb:

>> "hello".sub('l', '*')
=> "he*lo"
>> "hello".gsub('l', '*')
=> "he**o"
Ray Toal
źródło
13
Tak. Teraz rozumiem. Na moją obronę, nie sądzę, żeby było to zbyt oczywiste ... To znaczy do tej pory.
Ryanmt
15
Zgadzam się z tobą, że to nie jest oczywiste! Java nazywa je replacei replaceAll. Ale Ruby ma swoje korzenie w Perlu, który używa gmodyfikatora. To tylko jedna z tych rzeczy.
Ray Toal,
1
Na szczęście jest to teraz oczywiste. Dowiem się w przyszłości.
Ryanmt,
Nawiasem mówiąc, subjest znacznie szybszy niż gsub, jest tutaj benchmark github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu
Widzę różne zachowania: A, sentence, separated, by, commas".gsub!(/(.*),(.*)/,"\\2 \\1") => " commas A, sentence, separated, by" Jakieś myśli, dlaczego gsub!wydaje się, że znajdowanie / zastępowanie tylko pierwszego wystąpienia podczas korzystania z grup wyrażeń regularnych?
Bennett Talpers
31

Różnica polega na tym, że subzastępuje tylko pierwsze wystąpienie określonego wzorca, podczas gdy gsubrobi to dla wszystkich wystąpień (to znaczy zastępuje globalnie).

Chris Bunch
źródło
10
Gdybyś odpowiedział minutę wcześniej, być może 1020 więcej przedstawicieli byłoby Twoje. :)
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
źródło
-2

subi gsubwykonaj zastąpienie odpowiednio pierwszego i wszystkich dopasowań.

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
źródło