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


Respostas:


208

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

No irb:

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

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


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

-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"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.