Função Ruby para remover todos os espaços em branco?

573

Qual é a função Ruby para remover todos os espaços em branco? Estou procurando algo como o PHP trim()?

gpwu
fonte
36
Sua pergunta não é clara: você deseja remover todos os espaços em branco ou deseja se livrar dos espaços em branco à esquerda e à direita?
Sinan Ünür 28/10/09
25
O trim()espaço em branco das strips do PHP " do início e do fim de uma string " (como declarado na documentação ), não remove "todos os espaços em branco".
Tadeck
3
Em caso de dúvida, consulte a documentação online do Ruby para a classe String (consulte .strip abaixo).
Merovex
2
Observe que todas as respostas que usam String#stripou correspondem /\s+/removerão apenas o espaço em branco ASCII. Se você deseja garantir que qualquer espaço em branco não ASCII também seja capturado (por exemplo, HTML &nbsp), consulte a resposta estranhamente impopular do @EBooker.
MatzFan
1
Pena que essas grandes respostas não podem obter a dignidade final de um ser aceito
Nova Alexandria

Respostas:

846

Se você deseja remover apenas os espaços em branco à esquerda e à direita (como o aparamento do PHP), você pode usar .strip, mas se quiser remover todo o espaço em branco, pode usar .gsub(/\s+/, "").

joel.neely
fonte
5
"/ \ S + /" simples significa espaço em branco?
Iniciante em Rails
54
\ s + significa 1 ou mais caracteres de espaço em branco (espaço, nova linha, guia). O // circundante mostra que é uma expressão regular.
Dllanfm
3
Esta não é equivalente a trim ()
Brett Holt
6
tira era exatamente o que eu estava procurando, obrigado pela boa pergunta e awnser!
Francois
15
@BrettHolt A expressão gsub não é a mesma que aparar, mas o questionador incluiu a frase "todos os espaços em branco", que também não é o mesmo que aparar. Então eu dei alternativas.
Joel.neely
494
s = "I have white space".delete(' ')

E para emular a trim()função do PHP :

s = "   I have leading and trailing white space   ".strip
Ed S.
fonte
12
isso é muito mais legível que o regex, por que não é tão popular?
precisa saber é o seguinte
89
@ckarbass: porque muitas pessoas preferem soluções excessivamente complexas a problemas simples. Isso desaparece com a experiência.
Ed S.
97
@ckarbass @Ed S. Não é tão popular porque não é o mesmo. A pergunta original usava a frase "todos os espaços em branco", que inclui guias, novas linhas, etc. Essa resposta proposta não removerá os outros caracteres de espaço em branco. Quanto a "excessivamente complexo", sugiro comparar a expressão regular simples com .delete(' ').delete('\t').delete('\n') ..., que é excessivamente detalhada e oferece muitas oportunidades para erros de digitação e omissão.
Joel.neely
13
@ joel.neely: Eu respondi a essa pergunta há muito tempo, mas leia a pergunta novamente, desta vez com mais cuidado. O OP solicitou "uma função para remover todo o espaço em branco" , mas depois solicitou "algo como o trim () do PHP" . Então, é um pouco difícil saber exatamente o que eles querem aqui. trim()certamente não remove novas linhas e outros caracteres de espaço em branco. Você está escolhendo uma interpretação de uma pergunta vaga.
Ed S.
4
@ joel.neely: Dito isso, eu concordo que uma solução que vai além da interpretação literal da pergunta é melhor neste caso (ou seja, um regex removendo todos os caracteres que constituiriam espaços em branco em vez de uma série de delete()chamadas.)
Ed S.
163

Resposta relacionada:

"   clean up my edges    ".strip

retorna

"clean up my edges"
jrhicks
fonte
Esse é o que eu esqueci. Eu sabia que havia um método para remover espaços em branco que o faria por padrão se nenhum argumento fosse passado. +1
Ed S.
Isso é equivalente a aparar. Consulte a cotação do @Tadeck acima.
Brett Holt
3
Se houver a possibilidade de a variável ser nil, certifique-se de executar o .to_smétodo antes de executar a faixa, para que o método da faixa não apresente erro. Ex. str=nil; str.to_s.strip #=> ""
scarver2
Eu prefiro some_data.strip! if some_data.is_a? Cordas
slindsey3000
156

String#strip - remova todo o espaço em branco do início e do fim.

String#lstrip - desde o começo.

String#rstrip - só do fim.

String#chomp(sem argumentos) - exclui separadores de linha ( \nou \r\n) do final.

String#chop - exclui o último caractere.

String#delete- x.delete(" \t\r\n")- exclui todos os espaços em branco listados.

String#gsub- x.gsub(/[[:space:]]/, '')- remove todos os espaços em branco, incluindo os unicode .


Nota : Todos os métodos acima retornam uma nova sequência em vez de alterar o original. Se você deseja alterar a string no lugar, chame o método correspondente com !no final.

ndnenkov
fonte
O exemplo String # delete parece usar uma expressão regular, mas \sestá entre aspas, em vez de barras. Também não consegui encontrar nenhuma menção na documentação que delete possa levar uma regex como argumento.
urso-beiçudo
@ slothbear, não é uma expressão regular, é um pequeno conjunto de padrões que se assemelham a expressões regulares. Quanto à documentação #deleteé dito para trabalhar de forma semelhante a #count. Você pode experimentá-lo também no console.
Ndnenkov 5/02
Obrigado por me ensinar algo novo. E também obrigado pelo lembrete de tentar as coisas no menor contexto possível (linha de comando).
urso
1
@SeinopSys Eu queria manter essa resposta apenas em Ruby.
Ndnenkov # 16/18
2
Somente o exemplo final desta resposta captura o pavoroso 'espaço ininterrupto' ASCII 160, o banimento dos raspadores de rede. #stripnão. Veja stackoverflow.com/questions/4859438/…
MatzFan
95
"1232 23 2 23 232 232".delete(' ')
=> "123223223232232"

Excluir funciona mais rápido =)

user         system     total      real
gsub, s      0.180000   0.010000   0.190000 (0.193014)
gsub, s+     0.200000   0.000000   0.200000 (0.196408)
gsub, space  0.220000   0.000000   0.220000 (0.222711)
gsub, join   0.200000   0.000000   0.200000 (0.193478)
delete       0.040000   0.000000   0.040000 (0.045157)
rusllonrails
fonte
1
mas isso remove apenas spaces, não todoswhite spaces
Gavriel
1
delete(" \t\r\n")cuidará do espaço em branco típico e ainda é mais rápido que o gsub.
Seth Jeffery
94

Se você estiver usando o Rails / ActiveSupport , poderá usar o squishmétodo Remove o espaço em branco nas duas extremidades da cadeia e agrupa vários espaços em branco em um único espaço.

Por exemplo.

" a  b  c ".squish

resultará em:

"a b c"

Verifique esta referência em api.rubyonrails.org .

Radhika
fonte
4
Observe que as respostas somente para links são desencorajadas; as respostas SO devem ser o ponto final de uma pesquisa por uma solução (em comparação com outra parada de referências, que tendem a ficar obsoletas ao longo do tempo). Considere adicionar aqui uma sinopse independente, mantendo o link como referência.
precisa
2
Eu acho que essa resposta foi suficientemente explicada e o fato de o link ser referência, uma vez que a resposta em si foi claramente explicada. Esta função era boa, graças
ksugiarto
4
Isto é do ActiveSupport. Você não precisa de todo o Rails para usá-lo, mas precisa, pelo menos, do ActiveSupport e de umrequire 'active_support/core_ext/string/filters'
Justin Force
2
Para ser claro, esse é qualquer espaço em branco. Por exemplo"a \t \n \f \r \v b".squish == "a b"
Purplejacket 25/02
47

É um pouco tarde, mas qualquer pessoa pesquisando esta página no Google pode estar interessada nesta versão -

Se você deseja limpar um pedaço de texto pré-formatado que um usuário pode ter recortado e colado no seu aplicativo de alguma forma, mas preserva o espaçamento entre palavras, tente o seguinte:

content = "      a big nasty          chunk of     something

that's been pasted                        from a webpage       or something        and looks 

like      this

"

content.gsub(/\s+/, " ").strip

#=> "a big nasty chunk of something that's been pasted from a webpage or something and looks like this"
Jules Copeland
fonte
33
Pode-se também usar Rails' squishmétodo: apidock.com/rails/String/squish
Phillip Koebbe
5
Ou, se você não possui Rails e não possui novas linhas, squeeze(" ")pode funcionar.
Andrew Grimm
45

O .stripmétodo Ruby executa o PHP equivalente atrim() .

Para remover todo o espaço em branco:

"  leading    trailing   ".squeeze(' ').strip
=> "leading trailing"

A @Tass me informou que minha resposta original remove as cartas duplicadas sucessivamente - YUCK! Desde então, mudei para o método squish, que é mais inteligente sobre essas ocorrências se estiver usando a estrutura do Rails.

require 'active_support/all'
"  leading    trailing   ".squish
=> "leading trailing"

"  good    men   ".squish
=> "good men"

Cite: http://apidock.com/rails/String/squish

scarver2
fonte
1
Isso removerá os caracteres duplicados "unidos". "good men".squeeze.stripretornará"god men"
Tass
1
Obrigado por apontar isso para @Tass. Eu editei minha resposta em favor do método squish.
scarver2
1
+1 para "letras duplicadas em sucessão". Não consegui encontrar uma maneira de descrever o cenário. Bem feito! :-)
Tass
26
" Raheem Shaik ".strip

Ele remove os espaços do lado esquerdo e direito. Este código nos daria:"Raheem Shaik"

camarada
fonte
20

Também não se esqueça:

$ s = "   I have white space   ".split
=> ["I", "have", "white", "space"]
Justicle
fonte
6
Então, o s.split.join fará o trabalho.
Piotr Brudny
1
Isso é bom ao iterar:[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
tbloncar
20

split.join irá explodir todos os espaços em qualquer lugar da string.

"  a b  c    d     ".split.join
> "abcd"

É fácil digitar e lembrar, por isso é bom no console e para hackers rápidos. Indiscutivelmente, não é bem-vindo em código sério, pois mascara a intenção.

(Com base no comentário de Piotr na resposta de Justicle acima.)

mahemoff
fonte
1
Muito, muito obrigado por este comentário :-) Este é o único método que funciona se você tiver uma string longa que se parece com um parágrafo.
Boomerange
12

Você poderia tentar isso

"Some Special Text Values".gsub(/[[:space:]]+/, "")

using : space: remove o espaço sem quebra, juntamente com o espaço regular.

EBooker
fonte
1
Esta é realmente a melhor resposta IMHO, como no HTML selvagem &nbspe quaisquer outros espaços em branco não-ASCII não serão removidos String#stripou comparados por /\s/. Consulte a seção intitulada "Expressões de colchete POSIX" nos documentos
MatzFan 25/11/17
8

Use gsub ou delete. A diferença é que o gsub pode remover as guias, enquanto a exclusão não pode. Às vezes, você tem guias nos arquivos que são adicionados pelos editores.

a = "\tI have some whitespaces.\t"
a.gsub!(/\s/, '')  #=>  "Ihavesomewhitespaces."
a.gsub!(/ /, '')   #=>  "\tIhavesomewhitespaces.\t"
a.delete!(" ")     #=>  "\tIhavesomewhitespaces.\t"
a.delete!("/\s/")  #=>  "\tIhavesomewhitespaces.\t"
a.delete!('/\s/')  #=>  using single quote is unexpected, and you'll get "\tI have ome whitepace.\t"
euccas
fonte
8

Existem várias maneiras:
Para remover espaços em branco de ambos os lados:

Mais ou menos como o php's trim ()

Foo_bar.strip

Para remover todos os espaços:

Foo_bar.gsub(/ /, "")

Para remover todo o espaço em branco:

Foo_bar.gsub(/\s/, "")
Sapphire_Brick
fonte
6
"asd sda sda sd".gsub(' ', '')
=> "asdsdasdasd"
edikgat
fonte
mas isso remove apenas spaces, não todoswhite spaces
Gavriel
6

O método gsub funcionará perfeitamente.
O método gsub pode ser chamado em uma string e diz:

a = "this is a string"
a = a.gsub(" ","")
puts a
#Output: thisisastring

O método gsub procura todas as ocorrências do primeiro argumento e o substitui pelo segundo argumento. Nesse caso, ele substituirá todos os espaços da string e os removerá.

Outro exemplo:

b = "the white fox has a torn tail"

Vamos substituir todas as ocorrências da letra "t" por uma maiúscula "T"

b = b.gsub("t","T")
puts b 
#Output: The whiTe fox has a Torn Tail
bdbasinger
fonte
5

Para um comportamento exatamente igual ao PHP trim, o método mais simples é usar o String#stripmétodo, da seguinte maneira:

string = "  Many have tried; many have failed!    "
puts "Original [#{string}]:#{string.length}"
new_string = string.strip
puts "Updated  [#{new_string}]:#{new_string.length}"

O Ruby também possui uma versão edit-in-place, chamada String.strip!(observe o final '!'). Isso não requer a criação de uma cópia da sequência e pode ser significativamente mais rápido para alguns usos:

string = "  Many have tried; many have failed!    "
puts "Original [#{string}]:#{string.length}"
string.strip!
puts "Updated  [#{string}]:#{string.length}"

Ambas as versões produzem esta saída:

Original [  Many have tried; many have failed!    ]:40
Updated  [Many have tried; many have failed!]:34

Criei um benchmark para testar o desempenho de alguns usos básicos de stripe strip!, assim como algumas alternativas. O teste é este:

require 'benchmark'

string = 'asdfghjkl'
Times = 25_000

a = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
b = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
c = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
d = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }

puts RUBY_DESCRIPTION
puts "============================================================"
puts "Running tests for trimming strings"

Benchmark.bm(20) do |x|
  x.report("s.strip:")                 { a.each {|s| s = s.strip } }
  x.report("s.rstrip.lstrip:")         { a.each {|s| s = s.rstrip.lstrip } }
  x.report("s.gsub:")                  { a.each {|s| s = s.gsub(/^\s+|\s+$/, "") } }
  x.report("s.sub.sub:")               { a.each {|s| s = s.sub(/^\s+/, "").sub(/\s+$/, "") } }

  x.report("s.strip!")                 { a.each {|s| s.strip! } }
  x.report("s.rstrip!.lstrip!:")       { b.each {|s| s.rstrip! ; s.lstrip! } }
  x.report("s.gsub!:")                 { c.each {|s| s.gsub!(/^\s+|\s+$/, "") } }
  x.report("s.sub!.sub!:")             { d.each {|s| s.sub!(/^\s+/, "") ; s.sub!(/\s+$/, "") } }
end

Estes são os resultados:

ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-darwin14]
============================================================
Running tests for trimming strings
                           user     system      total        real
s.strip:               2.690000   0.320000   3.010000 (  4.048079)
s.rstrip.lstrip:       2.790000   0.060000   2.850000 (  3.110281)
s.gsub:               13.060000   5.800000  18.860000 ( 19.264533)
s.sub.sub:             9.880000   4.910000  14.790000 ( 14.945006)
s.strip!               2.750000   0.080000   2.830000 (  2.960402)
s.rstrip!.lstrip!:     2.670000   0.320000   2.990000 (  3.221094)
s.gsub!:              13.410000   6.490000  19.900000 ( 20.392547)
s.sub!.sub!:          10.260000   5.680000  15.940000 ( 16.411131)
Michael Gaskill
fonte
3

Minha preferência pessoal é usar o método .tr

como em:

string = "this is a string to smash together"

string.tr(' ', '') # => "thisisastringtosmashtogether"

Obrigado a @FrankScmitt por apontar que, para fazer isso excluir todos os espaços em branco (não apenas os espaços), você precisará escrevê-lo da seguinte forma:

string = "this is a string with tabs\t and a \nnewline"

string.tr(" \n\t", '') # => "thisisastringwithtabsandanewline"
Jeremy Gunter
fonte
mas isso remove apenas spaces, nãoall white spaces
Gavriel
Para remover todos os espaços em branco (espaço, tabulação, nova linha), considere usar s.tr(" \t\n", '').
10246 Frank Schmitt
@ Gavriel - Eu interpretei mal / não entendi a pergunta, obrigado por apontar isso.
11136 Jeremy Gunter
@FrankSchmitt Adicionei sua correção à minha resposta, para responder mais adequadamente à pergunta do OP. Obrigado por me corrigir.
11136 Jeremy Gunter
3

Eu estava tentando fazer isso porque queria usar um "título" de registros como um ID na exibição, mas os títulos tinham espaços.

uma solução é:

record.value.delete(' ') # Foo Bar -> FooBar
Brad
fonte
1

Ruby .scan()e.join() métodos de String também podem ajudar a superar o espaço em branco na string.

scan(/\w+/).join removerá todos os espaços e unirá a string

string = "White spaces in me".scan(/\w+/).join
=>"Whitespacesinme"

Também está removendo espaço da parte esquerda e direita da string. Meios ltrim, rtrime trim. Apenas no caso, se alguém tem fundo longo C, FoxProou Visual Basice saltar em Ruby.

2.1.6 :002 > string = " White spaces in me ".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :003 > string = " White spaces in me".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :004 > string = "White spaces in me ".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :005 >

Dharmesh Rupani
fonte
1
@AmitPandya Muito obrigado por apontar pontos-chave adicionais do método .scan (). Estimado !!!
Dharmesh Rupani
1

Eu usaria algo como isto:

my_string = "Foo bar\nbaz quux"

my_string.split.join
=> "Foobarbazquux"
Artur Okoński
fonte
direto. Graças
Peetha srikanth
1

Estou um pouco atrasado para o jogo, mas removo os espaços em branco à direita e à esquerda usando strip! . Se você tem uma matriz, como eu, precisei percorrer a matriz e salvá-la após o término da instância. O ! cuidou disso. Isso removeu todos os espaços em branco no final ou no início, não apenas o primeiro à esquerda ou o último à direita.

Por exemplo:

array = ["hello ","   Melanie", "is", " new ", "to  ", " programming"]
array.each do |i|
  i.strip!
end

Isso produziria para: ["olá", "Melanie", "é", "novo", "para", "programação"]. Eu explorei / compartilhei isso em um vídeo que fiz para destacar esse código para uma pergunta semelhante que eu tinha .

Eu sou mais novo na programação e o uso de strip não funcionou, pois não o salvou na matriz após o término do loop.

Melanie
fonte
0

Você pode tentar isso:

"ab c d efg hi ".split.map(&:strip)

para conseguir isso:

["ab, "c", "d", "efg", "hi"]

ou se você quiser uma única string, use:

"ab c d efg hi ".split.join
LvcasX1
fonte