Substituir palavras em uma string - Ruby

281

Eu tenho uma string no Ruby:

sentence = "My name is Robert"

Como posso substituir facilmente qualquer palavra nesta frase sem usar código complexo ou loop?

Mithun Sasidharan
fonte
Substitua de que maneira? Substitua uma palavra arbitrária (palavra 2) ou uma palavra específica ( my)?
Blender
Obrigado pela sua pergunta curta, simples e útil. ele me ajudou encontrar uma solução para hashtags estilo na minha opinião
Stef Hej

Respostas:

494
sentence.sub! 'Robert', 'Joe'

Não causará uma exceção se a palavra substituída não estiver na frase (a []=variante será).

Como substituir todas as instâncias?

O exemplo acima substitui apenas a primeira instância de "Robert".

Para substituir todas as instâncias, use gsub/ gsub!(ou seja, "substituição global"):

sentence.gsub! 'Robert', 'Joe'

O texto acima substituirá todas as instâncias de Robert por Joe.

srcspider
fonte
Isso parece substituir apenas a primeira instância, o que, é claro, às vezes é bom e às vezes não.
Jason Swett
@JasonSwett atualizou a resposta para cobrir como substituir todas as instâncias.
Srcpider
128

Se você estiver lidando com texto em idioma natural e precisar substituir uma palavra, não apenas parte de uma string, precisará adicionar uma pitada de expressões regulares ao seu gsub, pois uma substituição de texto sem formatação pode levar a resultados desastrosos:

'mislocated cat, vindicating'.gsub('cat', 'dog')
=> "mislodoged dog, vindidoging"

Expressões regulares têm limites de palavras, como \bquais correspondem ao início ou ao final de uma palavra. Portanto,

'mislocated cat, vindicating'.gsub(/\bcat\b/, 'dog')
=> "mislocated dog, vindicating"

Em Ruby, diferentemente de outros idiomas como Javascript, os limites de palavras são compatíveis com UTF-8, portanto, você pode usá-lo para idiomas com alfabetos latinos não latinos ou estendidos:

'сіль у кисіль, для весіль'.gsub(/\bсіль\b/, 'цукор')
=> "цукор у кисіль, для весіль"
Hnatt
fonte
6
Observe que algumas linguagens nem usam espaços, portanto \b, não funcionam nelas, você precisaria usar analisadores morfológicos ou coisas assim nesses casos. Além disso, +1 para um exemplo hilário.
NiñoScript
57

Você pode tentar usar desta maneira:

sentence ["Robert"] = "Roger"

Então a sentença se tornará:

sentence = "My name is Roger" # Robert is replaced with Roger
Mithun Sasidharan
fonte
4
Isso é bem interessante. Eu nunca vi esse método de substituição antes.
Sean Hill
6
Você não receberá um erro com esse método se a sequência original não contiver a palavra que você está tentando substituir?
Srcpider
2
Apenas certifique-se de reduzir novamente IndexError. Caso contrário, uma palavra que não faça parte da frase levará a:string not matched (IndexError)
Konrad Reiche 25/03
9
Outro problema com esse método é que ele substitui apenas a primeira instância da string.
Martin Konecny
14
Isso é interessante, mas definitivamente não deve ser marcado como a resposta correta.
Niels Abildgaard
46

Primeiro, você não declara o tipo no Ruby, portanto não precisa do primeiro string.

Para substituir uma palavra em cadeia, você faz: sentence.gsub(/match/, "replacement").

Sean Hill
fonte