В чем разница между методами gsub и sub для строк Ruby

111

Я просматривал документацию на Stringсегодня и увидел :subметод, которого никогда раньше не замечал. Я использую, :gsubи похоже, что они по сути одинаковы. Может ли кто-нибудь объяснить мне разницу? Спасибо!

Ryanmt
источник
5
ruby-doc.org/core/classes/String.html
mu слишком короток

Ответы:

208

Это gозначает global, как в replace global (all):

В irb:

>> "hello".sub('l', '*')
=> "he*lo"
>> "hello".gsub('l', '*')
=> "he**o"
Рэй Тоул
источник
13
Да. Теперь я понимаю. В свое оправдание я не думаю, что это было очень очевидно ... До сих пор.
Ryanmt
15
Я согласен с вами, что это не очевидно! Java называет их replaceи replaceAll. Но у Ruby есть корни в Perl, который использует gмодификатор. Это просто одна из тех вещей.
Ray Toal
1
К счастью, теперь это очевидно. Я узнаю в будущем.
Ryanmt
Кстати, subнамного быстрее, чем gsub, здесь есть тест github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu
Я вижу различное поведение по отношению к этому: A, sentence, separated, by, commas".gsub!(/(.*),(.*)/,"\\2 \\1") => " commas A, sentence, separated, by" какие-либо мысли, почему, gsub!кажется, находит / заменяет только первый экземпляр при использовании групп регулярных выражений?
Bennett Talpers
31

Разница в том, что subзаменяет только первое вхождение указанного шаблона, тогда gsubкак заменяет все вхождения (то есть заменяет глобально).

Крис Банч
источник
10
Если бы вы ответили на минуту раньше, возможно, у вас было бы еще 1020 повторений. :)
Эндрю Гримм
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

subи gsubпроизвести замену первого и всех совпадений соответственно.

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"
ГЕМАНТКУМАР ГАДИ
источник