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  ), 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+/, "").
\ 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
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.)
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#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/…
user system total real
gsub, s 0.1800000.0100000.190000(0.193014)
gsub, s+0.2000000.0000000.200000(0.196408)
gsub, space 0.2200000.0000000.220000(0.222711)
gsub, join 0.2000000.0000000.200000(0.193478)
delete 0.0400000.0000000.040000(0.045157)
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.
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"
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"
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.
Esta é realmente a melhor resposta IMHO, como no HTML selvagem  e 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"
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
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!]:40Updated[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.6900000.3200003.010000(4.048079)
s.rstrip.lstrip:2.7900000.0600002.850000(3.110281)
s.gsub:13.0600005.80000018.860000(19.264533)
s.sub.sub:9.8800004.91000014.790000(14.945006)
s.strip!2.7500000.0800002.830000(2.960402)
s.rstrip!.lstrip!:2.6700000.3200002.990000(3.221094)
s.gsub!:13.4100006.49000019.900000(20.392547)
s.sub!.sub!:10.2600005.68000015.940000(16.411131)
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"
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 >
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.
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".String#strip
ou 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 
), consulte a resposta estranhamente impopular do @EBooker.Respostas:
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+/, "")
.fonte
E para emular a
trim()
função do PHP :fonte
.delete(' ').delete('\t').delete('\n') ...
, que é excessivamente detalhada e oferece muitas oportunidades para erros de digitação e omissão.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.delete()
chamadas.)Resposta relacionada:
retorna
fonte
nil
, certifique-se de executar o.to_s
método antes de executar a faixa, para que o método da faixa não apresente erro. Ex.str=nil; str.to_s.strip #=> ""
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 (\n
ou\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.fonte
\s
está 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.#delete
é dito para trabalhar de forma semelhante a#count
. Você pode experimentá-lo também no console.#strip
não. Veja stackoverflow.com/questions/4859438/…Excluir funciona mais rápido =)
fonte
spaces
, não todoswhite spaces
delete(" \t\r\n")
cuidará do espaço em branco típico e ainda é mais rápido que o gsub.Se você estiver usando o Rails / ActiveSupport , poderá usar o
squish
mé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.
resultará em:
Verifique esta referência em api.rubyonrails.org .
fonte
require 'active_support/core_ext/string/filters'
"a \t \n \f \r \v b".squish == "a b"
É 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:
fonte
squish
método: apidock.com/rails/String/squishsqueeze(" ")
pode funcionar.O
.strip
método Ruby executa o PHP equivalente atrim()
.Para remover todo o espaço em branco:
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.
Cite: http://apidock.com/rails/String/squish
fonte
"good men".squeeze.strip
retornará"god men"
Ele remove os espaços do lado esquerdo e direito. Este código nos daria:
"Raheem Shaik"
fonte
Também não se esqueça:
fonte
[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
split.join
irá explodir todos os espaços em qualquer lugar da string.É 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.)
fonte
Você poderia tentar isso
using : space: remove o espaço sem quebra, juntamente com o espaço regular.
fonte
 
e quaisquer outros espaços em branco não-ASCII não serão removidosString#strip
ou comparados por/\s/
. Consulte a seção intitulada "Expressões de colchete POSIX" nos documentosUse 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.
fonte
Existem várias maneiras:
Para remover espaços em branco de ambos os lados:
Para remover todos os espaços:
Para remover todo o espaço em branco:
fonte
fonte
spaces
, não todoswhite spaces
O método gsub funcionará perfeitamente.
O método gsub pode ser chamado em uma string e diz:
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:
Vamos substituir todas as ocorrências da letra "t" por uma maiúscula "T"
fonte
Para um comportamento exatamente igual ao PHP
trim
, o método mais simples é usar oString#strip
método, da seguinte maneira: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:Ambas as versões produzem esta saída:
Criei um benchmark para testar o desempenho de alguns usos básicos de
strip
estrip!
, assim como algumas alternativas. O teste é este:Estes são os resultados:
fonte
Minha preferência pessoal é usar o método
.tr
como em:
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:
fonte
spaces
, nãoall white spaces
s.tr(" \t\n", '')
.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 é:
fonte
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 stringTambém está removendo espaço da parte esquerda e direita da string. Meios
ltrim
,rtrim
etrim
. Apenas no caso, se alguém tem fundo longoC
,FoxPro
ouVisual Basic
e saltar emRuby
.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 >
fonte
Eu usaria algo como isto:
fonte
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:
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.
fonte
Você pode tentar isso:
para conseguir isso:
ou se você quiser uma única string, use:
fonte