すべての空白を削除するRuby関数?


573

すべての空白を削除するRuby関数とは何ですか?PHPのようなものを探していtrim()ますか?


36
あなたの質問は明確ではありません:すべての空白を削除しますか、それとも先頭と末尾の空白を削除しますか?
SinanÜnür2009年

25
PHP は、文字列の最初と最後からtrim()「空白」削除します(「ドキュメント」に記載されています)。「すべての空白」は削除されません。
Tadeck

3
疑問がある場合は、RubyのオンラインドキュメントでStringクラスを参照してください(以下の.stripを参照)。
Merovex 2013

2
すべての回答を使用String#stripまたは照合する/\s+/と、ASCII空白のみが削除されることに注意してください。ASCII以外の空白(HTMLなど&nbsp)もキャプチャされるようにしたい場合は、@ EBookerからの奇妙に人気のない回答を参照してください。
MatzFan 2017年

1
そのような素晴らしい答えが受け入れられる人の最終的な尊厳を得ることができないのは残念です
新しいアレクサンドリア

回答:


846

先頭と末尾の空白のみを削除する場合(PHPのトリムなど)、を使用できますが.stripすべての空白を削除する場合は、.gsub(/\s+/, "")代わりにを使用できます。


5
"/ \ s + /"は空白を意味しますか?
Rails初心者、

54
\ s +は、1つ以上の空白文字(スペース、改行、タブ)を意味します。//は、正規表現であることを示しています。
dylanfm 2011

3
これはtrim()と同等ではありません
Brett Holt

6
ストリップはまさに私が探していたものでした、良い質問とオーナに感謝します!
フランソワ

15
@BrettHolt gsub式は、trimと同じではありませんが、質問者は「all whitespace」という語句を含んでおり、trimとも同じではありません。だから私は代わりを与えました。
joel.neely

494
s = "I have white space".delete(' ')

そして、PHPのtrim()機能をエミュレートするには:

s = "   I have leading and trailing white space   ".strip

12
これは正規表現よりもはるかに読みやすいですが、なぜそれほど人気が​​ないのですか?
ckarbass 2012

89
@ckarbass:多くの人々は単純な問題に対して過度に複雑な解決策を好むからです。それは経験とともになくなります。
Ed S.

97
@ckarbass @Ed S.同じではないため、あまり人気がありません。元の質問では、タブ、改行などを含む「すべての空白」というフレーズが使用されていました。この提案された回答では、これらの他の空白文字は削除されません。「過度に複雑」については、単純な正規表現をと比較することをお勧めします.delete(' ').delete('\t').delete('\n') ...。これは過度に冗長であり、タイプミスや省略のエラーの多くの機会を提供します。
joel.neely

13
@ joel.neely:私はずっと前にこの質問に答えましたが、もう一度質問を読んでください、今回はより注意深く。OPは「すべての空白を削除する関数」を要求しましたが、「PHPのtrim()のようなもの」を要求しました。したがって、彼らがここで何を望んでいるかを正確に知ることは少し難しいです。 trim()改行やその他の空白文字は削除されません。あいまいな質問の解釈を1つ選択しています。
Ed S.

4
@ joel.neely:とはいえ、私は質問の文字通りの解釈を超えたソリューションは、この場合は、より良い1であることに同意(すなわち、空白ではなく、文字列の構成するであろうすべての文字削除する正規表現delete()の呼び出しを。)
Ed S.

163

関連する回答:

"   clean up my edges    ".strip

戻り値

"clean up my edges"

それは私が忘れていたものです。引数が渡されない場合にデフォルトで空白を削除する方法があることを知っていました。+1
Ed S.

これはトリムと同じです。上記の@Tadeckからの引用を参照してください。
Brett Holt

3
変数がnilである可能性がある場合は、.to_sstripメソッドがエラーを発生させないように、strip を実行する前に必ずメソッドを実行してください。例 str=nil; str.to_s.strip #=> ""
scarver2

some_data.stripを使用します。some_data.is_a?文字列
slindsey3000 2018

156

String#strip -最初と最後からすべての空白を削除します。

String#lstrip -最初から。

String#rstrip -終わりから。

String#chomp(引数なし)-行の区切り(\nまたは\r\n)を末尾から削除します。

String#chop -最後の文字を削除します。

String#delete-- x.delete(" \t\r\n")リストされたすべての空白を削除します。

String#gsub- x.gsub(/[[:space:]]/, '')-を含め、すべての空白を削除するUnicodeのもの


:上記のすべてのメソッドは、元の文字列を変更するのではなく、新しい文字列を返します。文字列をその場で変更したい場合!は、最後に対応するメソッドを呼び出します。


String#deleteの例は正規表現を使用しているように見えますが\s、スラッシュではなく引用符で囲まれています。また、私はドキュメントで削除が引数として正規表現を取ることができるという言及を見つけることができませんでした。
ナマケモノ2017

@slothbear、それは正規表現ではなく、正規表現に似たパターンの小さなセットです。ドキュメントに関して#deleteはと同様に機能すると言われてい#countます。コンソールでもお試しいただけます。
ndnenkov 2017

新しいことを教えてくれてありがとう。また、可能な限り最小のコンテキスト(コマンドライン)で物事を試すことを思い出させてくれたことにも感謝します。
ナマケモノ2017

1
@SeinopSys私はこの答えをRubyだけにしたかった。
ndnenkov 2018

2
この回答の最後の例のみが、Webスクレイパーの悩みの種である恐ろしいASCII 160「ノンブレイキングスペース」を捉えています。#stripではない。stackoverflow.com/questions/4859438/…を
MatzFan

95
"1232 23 2 23 232 232".delete(' ')
=> "123223223232232"

削除はより速く機能します=)

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
ただし、削除されるのspacesはすべてではなくwhite spaces
ガブリエル

1
delete(" \t\r\n")典型的な空白を処理し、gsubよりも高速です。
セスジェフリー2018年

94

Rails / ActiveSupportを使用している場合は、squishメソッドを使用できます。文字列の両端の空白を削除し、複数の空白を1つのスペースにグループ化します。

たとえば

" a  b  c ".squish

結果は:

"a b c"

api.rubyonrails.orgからこの参照を確認してください。


4
リンクのみの回答は推奨されないことに注意してください。SOの回答は、ソリューションの検索のエンドポイントである必要があります。参照としてリンクを維持しながら、ここにスタンドアロンの概要を追加することを検討してください。
kleopatra 2013年

2
この回答は十分に説明されたと思いますし、回答自体が明確だったのでリンクが参照であったという事実は説明されました。この機能は良かったです。ありがとう
ksugiarto '11 / 11/4

4
これはActiveSupportからです。すべてのRailsを使用する必要はありませんが、少なくともActiveSupportとaが必要ですrequire 'active_support/core_ext/string/filters'
Justin Force

2
明確にするために、これは任意の空白文字。例"a \t \n \f \r \v b".squish == "a b"
パープルジャケット

47

少し遅いですが、このページをグーグルで検索している人なら誰でもこのバージョンに興味があるかもしれません-

ユーザーが何らかの方法でアプリにカットアンドペーストしたフォーマット済みテキストのチャンクをクリーンアップしたいが、単語の間隔は維持したい場合は、次を試してください。

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
Railsのsquishメソッドを使用することもできます:apidock.com/rails/String/squish
Phillip Koebbe

5
あるいは、Railsがなく、改行もない場合は、うまくいくsqueeze(" ")かもしれません。
アンドリューグリム

45

Rubyの.stripメソッドは、と同等のPHPを実行しますtrim()

すべての空白を削除するには:

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

@Tassは、私の元の答えが重複した文字を連続して削除することを認識させました-YUCK!私はそれ以来、Railsフレームワークを使用している場合、そのような発生についてより賢いsquishメソッドに切り替えました。

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

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

引用:http : //apidock.com/rails/String/squish


1
これにより、「結合された」重複文字が削除されます。"good men".squeeze.strip戻ります"god men"
Tass

1
@Tassを指摘していただきありがとうございます。私はスキッシュメソッドを支持して私の答えを編集しました。
scarver2

1
+1は「連続した文字の重複」を表します。シナリオを説明する方法が思いつきませんでした。よくやった!:-)
Tass

26
" Raheem Shaik ".strip

左側と右側のスペースが削除されます。このコードは私たちに与えるでしょう:"Raheem Shaik"


20

また、忘れないでください:

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

6
したがって、s.split.joinがその役割を果たします。
Piotr Brudny

1
繰り返し処理を行う場合、これはいいです:[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
tbloncar

20

split.join 文字列の任意の場所にあるすべてのスペースを爆破します。

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

入力も記憶も簡単なので、コンソール上ですばやくハッキングできます。それは意図を隠すので、間違いなく深刻なコードでは歓迎されません。

(上記のJusticleの回答の Piotrのコメントに基づく


1
このコメントに感謝します:-)これは、段落のような長い文字列がある場合に機能する唯一の方法です。
Boomerange 2017年

12

あなたはこれを試すことができます

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

:space:を使用すると、通常のスペースとともに非改行スペースが削除されます。


1
これは実際にはIMHOの最良の回答です。ワイルドHTML &nbspやその他の非ASCII空白文字はによって削除または照合されないためです。Regexpドキュメントの「POSIXブラケット式」というタイトルのセクションを参照してくださいString#strip/\s/
MatzFan

8

gsubまたはdeleteを使用します。違いは、gsubはタブを削除できますが、削除はできないことです。エディタによって追加されたファイルにタブがある場合があります。

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

多くの方法があります:
両側から空白を削除するには:

PHPのtrim()のようなもの

Foo_bar.strip

すべてのスペースを削除するには:

Foo_bar.gsub(/ /, "")

すべての空白を削除するには:

Foo_bar.gsub(/\s/, "")


6

gsubメソッドは問題なく動作します。
gsubメソッドは文字列で呼び出すことができ、次のように言います。

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

gsubメソッドは、最初の引数のすべての出現を検索し、それを2番目の引数に置き換えます。この場合、文字列内のすべてのスペースが置き換えられて削除されます。

もう一つの例:

b = "the white fox has a torn tail"

すべての文字「t」を大文字の「T」に置き換えましょう

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

5

PHP trimと完全に一致する動作の場合、最も簡単な方法は次のString#stripようにメソッドを使用することです。

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

Rubyには、その場で編集できるバージョンもありますString.strip!(末尾の「!」に注意してください)。これは文字列のコピーを作成する必要がなく、一部の用途では大幅に高速化できます。

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

どちらのバージョンでもこの出力が生成されます。

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

stripおよびのいくつかの基本的な使用strip!法といくつかの代替法のパフォーマンスをテストするためのベンチマークを作成しました。テストはこれです:

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

これらは結果です:

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

私の個人的な好みは方法を使用しています .tr

のように:

string = "this is a string to smash together"

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

@FrankScmittに感謝します。これにより、すべての空白(スペースだけでなく)を削除するには、次のように記述する必要があります。

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

string.tr(" \n\t", '') # => "thisisastringwithtabsandanewline"

ただし、削除されるのはspaces、のみではありませんall white spaces
Gavriel

すべての空白(スペース、タブ、改行)を削除するには、s.tr(" \t\n", '')代わりにを使用することを検討してください。
フランクシュミット

@Gavriel-質問を誤解/誤解しました。指摘していただきありがとうございます。
Jeremy Gunter

@FrankSchmitt OPの質問により適切に回答するために、私の回答に修正を追加しました。訂正していただきありがとうございます。
Jeremy Gunter

3

ビューのIDとしてレコード「タイトル」を使用したいのですが、タイトルにスペースがあったため、これを試みました。

解決策は:

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

1

Ruby .scan().join()Stringのメソッドも、文字列の空白を克服するのに役立ちます。

scan(/\w+/).join すべてのスペースを削除して文字列を結合します

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

また、ストリングの左右の部分からスペースを削除しています。手段ltrimrtrimtrim。誰かがバックグラウンドを持っている場合に備えてCFoxProまたはVisual Basicジャンプしてください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 .scan()メソッドの追加の重要なポイントを指摘していただき、ありがとうございます。感謝 !!!
Dharmesh Rupani


1

ゲームには少し遅れますが、を使用して末尾と先頭の空白を削除しstrip!ます。私のように配列がある場合は、配列を反復処理して、インスタンスの終了後に保存する必要がありました。!これを処理しました。これにより、最初の先頭または最後の末尾だけでなく、末尾または先頭のすべての空白が削除されました。

例えば:

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

これは、["hello"、 "Melanie"、 "is"、 "new"、 "to"、 "programming"]に出力されます。私が作成したビデオでこれをさらに調査/共有し、私が持っていた同様の質問に対してこのコードを強調しました

プログラミングの初心者ですが、ループの終了後にストリップを配列に保存しなかったため、ストリップを使用しても機能しませんでした。


0

あなたはこれを試すことができます:

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

これを得るために:

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

または、単一の文字列が必要な場合は、次のように使用します。

"ab c d efg hi ".split.join
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.