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()?


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+/, "").


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

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"

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.


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)

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 .


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"

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


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"


20

Também não se esqueça:

$ s = "   I have white space   ".split
=> ["I", "have", "white", "space"]

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


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.


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"

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/, "")

6
"asd sda sda sd".gsub(' ', '')
=> "asdsdasdasd"

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

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)

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"

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

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 >


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


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.


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