Qual é a diferença entre os métodos gsub e sub para Ruby Strings

111

Estive examinando a documentação de Stringhoje e vi o :submétodo, que nunca havia notado antes. Tenho usado :gsube parece que eles são essencialmente os mesmos. Alguém pode explicar a diferença para mim? Obrigado!

Ryanmt
fonte

Respostas:

208

O gsignifica global, como em substituir globalmente (todos):

No irb:

>> "hello".sub('l', '*')
=> "he*lo"
>> "hello".gsub('l', '*')
=> "he**o"
Ray Toal
fonte
13
Sim. Eu entendo agora. Em minha defesa, não acho que isso fosse muito óbvio ... Até agora, claro.
Ryanmt de
15
Eu concordo com você que não é óbvio! Java os chama de replacee replaceAll. Mas Ruby tem suas raízes em Perl, que usa o gmodificador. É apenas uma daquelas coisas.
Ray Toal
1
Felizmente, agora é óbvio. Eu saberei no futuro.
Ryanmt
A propósito, subé muito mais rápido do que gsub, há uma referência aqui github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu
Estou vendo alguns comportamentos diferentes em relação a isso: A, sentence, separated, by, commas".gsub!(/(.*),(.*)/,"\\2 \\1") => " commas A, sentence, separated, by" Alguma idéia de por que gsub!parece estar localizando / substituindo apenas a primeira instância ao usar grupos regex?
Bennett Talpers
31

A diferença é que subapenas substitui a primeira ocorrência do padrão especificado, enquanto o gsubfaz para todas as ocorrências (ou seja, ele substitui globalmente).

Chris Bunch
fonte
10
Se você tivesse respondido um minuto antes, talvez mais 1020 repetições seriam suas. :)
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
fonte
-2

sube gsubrealizar a substituição da primeira e de todas as correspondências, respectivamente.

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
fonte