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.