Fungsi Ruby untuk menghapus semua spasi putih?


573

Apa fungsi Ruby untuk menghapus semua spasi putih? Saya mencari sesuatu seperti PHP trim()?


36
Pertanyaan Anda tidak jelas: Apakah Anda ingin menghapus semua spasi putih atau apakah Anda ingin menghapus memimpin dan mengikuti spasi?
Sinan Ünür

25
PHP trim()mengosongkan spasi putih " dari awal dan akhir sebuah string " (sebagaimana dinyatakan dalam dokumentasi ), PHP tidak menghapus "semua spasi putih".
Tadeck

3
Jika ragu, lihat dokumentasi Ruby online untuk kelas String (lihat .strip di bawah).
Merovex

2
Perhatikan bahwa semua jawaban yang menggunakan String#stripatau mencocokkan /\s+/hanya akan menghapus spasi ASCII. Jika Anda ingin memastikan spasi kosong non-ASCII juga ditangkap (mis. HTML &nbsp), lihat jawaban aneh yang tidak populer dari @EBooker.
MatzFan

1
Sayang sekali bahwa jawaban yang luar biasa seperti itu tidak bisa mendapatkan martabat terakhir dari seseorang yang diterima
New Alexandria

Jawaban:


846

Jika Anda ingin menghapus whitespace hanya memimpin dan trailing (seperti trim PHP) yang dapat Anda gunakan .strip, tetapi jika Anda ingin menghapus semua spasi putih, Anda dapat menggunakan .gsub(/\s+/, "").


5
Apakah "/ \ s + /" sederhana artinya spasi putih?
Rails beginner

54
\ s + berarti 1 atau lebih karakter spasi putih (spasi, baris baru, tab). // Sekitar menunjukkan bahwa itu adalah ekspresi reguler.
dylanfm

3
Ini tidak setara dengan trim ()
Brett Holt

6
Strip persis apa yang saya cari, terima kasih atas pertanyaan dan awnser bagus!
Francois

15
@ BrettHolt Ekspresi gsub tidak sama dengan trim, tetapi si penanya menyertakan frasa "semua spasi", yang tidak sama dengan trim juga. Jadi saya memberi alternatif.
joel.neely

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

Dan untuk meniru trim()fungsi PHP :

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

12
ini jauh lebih mudah dibaca daripada regex, mengapa tidak sepopuler itu?
ckarbass

89
@ckarbass: Karena banyak orang lebih suka solusi yang terlalu rumit untuk masalah sederhana. Itu hilang dengan pengalaman.
Ed S.

97
@ckarbass @Ed S. Tidak sepopuler itu karena tidak sama. Pertanyaan awal menggunakan frasa "semua spasi putih", yang mencakup tab, baris baru, dll. Jawaban yang diajukan ini tidak akan menghapus karakter spasi putih lainnya. Adapun "terlalu rumit", saya sarankan membandingkan ekspresi reguler sederhana .delete(' ').delete('\t').delete('\n') ..., yang terlalu bertele-tele dan memberikan banyak peluang untuk kesalahan ketik dan kesalahan penghilangan.
joel.neely

13
@ joel.neely: Saya menjawab pertanyaan ini sejak lama, tetapi membaca pertanyaan itu lagi, kali ini lebih hati-hati. OP meminta "fungsi untuk menghapus semua spasi putih" , tetapi kemudian meminta "sesuatu seperti trim PHP ()" . Jadi, agak sulit untuk tahu persis apa yang mereka inginkan di sini. trim()tentu saja tidak menghapus baris baru dan karakter spasi putih lainnya. Anda memilih satu interpretasi dari pertanyaan yang tidak jelas.
Ed S.

4
@ joel.neely: Yang mengatakan, saya setuju bahwa solusi yang melampaui interpretasi literal dari pertanyaan adalah yang lebih baik dalam kasus ini (yaitu, regex menghapus semua karakter yang akan membentuk spasi daripada daripada serangkaian delete()panggilan.)
Ed S.

163

Jawaban terkait:

"   clean up my edges    ".strip

kembali

"clean up my edges"

Itu yang saya lupa. Saya tahu ada metode untuk menghapus spasi putih yang akan melakukannya secara default jika tidak ada argumen yang lolos. +1
Ed S.

Ini setara dengan trim. Silakan merujuk ke kutipan dari @Tadeck di atas.
Brett Holt

3
Jika ada kemungkinan variabel tersebut nil, pastikan untuk menjalankan .to_smetode sebelum menjalankan strip sehingga metode strip tidak menimbulkan kesalahan. Ex. str=nil; str.to_s.strip #=> ""
scarver2

Saya lebih suka some_data.strip! jika some_data.is_a? String
slindsey3000

156

String#strip - Hapus semua spasi putih dari awal dan akhir.

String#lstrip - hanya dari awal.

String#rstrip - Baru dari akhir.

String#chomp(tanpa argumen) - menghapus pemisah baris ( \natau \r\n) dari ujung.

String#chop - menghapus karakter terakhir.

String#delete- x.delete(" \t\r\n")- menghapus semua spasi yang terdaftar.

String#gsub- x.gsub(/[[:space:]]/, '')- menghapus semua spasi putih, termasuk yang unicode .


Catatan : Semua metode di atas mengembalikan string baru daripada bermutasi yang asli. Jika Anda ingin mengubah string di tempat, panggil metode yang sesuai dengan !di akhir.


Contoh String # delete tampaknya menggunakan regex, tetapi \smenggunakan tanda kutip, bukan garis miring. Juga saya tidak dapat menemukan disebutkan dalam dokumentasi yang menghapus dapat mengambil regex sebagai argumen.
slothbear

@ Slothbear, ini bukan regex, itu adalah satu set kecil pola yang menyerupai regex. Adapun dokumentasi #deletedikatakan bekerja mirip dengan #count. Anda dapat mencobanya di konsol juga.
ndnenkov

Terima kasih telah mengajari saya sesuatu yang baru. Dan juga terima kasih atas pengingat untuk mencoba hal-hal dalam konteks sekecil mungkin (baris perintah).
slothbear

1
@SeinopSys Saya hanya ingin menyimpan jawaban ini Ruby.
ndnenkov

2
Hanya contoh terakhir dalam jawaban ini yang menangkap 'ruang non-breaking' ASCII yang menakutkan, kutukan para pencakar web. #striptidak. Lihat stackoverflow.com/questions/4859438/…
MatzFan

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

Hapus bekerja lebih cepat =)

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
tetapi ini hanya menghapus spaces, tidak semuawhite spaces
Gavriel

1
delete(" \t\r\n")akan menangani spasi putih yang khas, dan masih lebih cepat dari gsub.
Seth Jeffery

94

Jika Anda menggunakan Rails / ActiveSupport , Anda dapat menggunakan squishmetode. Ini menghilangkan ruang putih di kedua ujung string dan mengelompokkan beberapa ruang putih ke ruang tunggal.

Untuk misalnya.

" a  b  c ".squish

akan menghasilkan:

"a b c"

Periksa referensi ini dari api.rubyonrails.org .


4
Perhatikan bahwa jawaban hanya tautan tidak disarankan, jawaban SO harus menjadi titik akhir pencarian solusi (vs. persinggahan referensi lainnya, yang cenderung menjadi basi seiring waktu). Harap pertimbangkan untuk menambahkan sinopsis mandiri di sini, dengan menjaga tautan sebagai referensi.
kleopatra

2
Saya pikir jawaban ini sudah cukup dijelaskan dan fakta bahwa tautan adalah referensi karena jawabannya sendiri sudah jelas dijelaskan. Fungsi ini bagus, terima kasih
ksugiarto

4
Ini dari ActiveSupport. Anda tidak memerlukan semua Rails untuk menggunakannya, tetapi Anda membutuhkan setidaknya ActiveSupport dan arequire 'active_support/core_ext/string/filters'
Justin Force

2
Untuk menjadi jelas, ini adalah setiap spasi. Misalnya"a \t \n \f \r \v b".squish == "a b"
Purplejacket

47

Ini agak terlambat, tetapi siapa pun yang menelusuri laman ini mungkin tertarik dengan versi ini -

Jika Anda ingin membersihkan sepotong teks yang telah diformat sebelumnya yang mungkin telah dipotong & ditempelkan pengguna ke aplikasi Anda, tetapi pertahankan jarak kata, coba ini:

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
Seseorang juga dapat menggunakan squishmetode Rails : apidock.com/rails/String/squish
Phillip Koebbe

5
Atau jika Anda tidak memiliki Rails, dan Anda tidak memiliki baris baru, squeeze(" ")mungkin berhasil.
Andrew Grimm

45

.stripMetode Ruby melakukan setara dengan PHP trim().

Untuk menghapus semua spasi putih:

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

@Tass membuat saya sadar bahwa jawaban asli saya menghapus surat duplikat secara berurutan - YUCK! Sejak itu saya beralih ke metode squish yang lebih pintar tentang kejadian seperti itu jika menggunakan kerangka Rails.

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

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

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


1
Ini akan menghapus "duplikat" karakter duplikat. "good men".squeeze.stripakan kembali"god men"
Tass

1
Terima kasih telah menunjukkan bahwa @Tass. Saya telah mengedit jawaban saya demi metode squish.
scarver2

1
+1 untuk "duplikat surat berturut-turut." Saya tidak bisa menemukan cara untuk menggambarkan skenario. Sudah selesai dilakukan dengan baik! :-)
Tass

26
" Raheem Shaik ".strip

Ini akan menghapus ruang sisi kiri & kanan. Kode ini akan memberi kita:"Raheem Shaik"


20

Juga jangan lupa:

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

6
Jadi s.split.join akan melakukan pekerjaan itu.
Piotr Brudny

1
Ini bagus saat iterasi:[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
tbloncar

20

split.join akan meledakkan semua ruang di manapun di string.

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

Mudah untuk mengetik dan mengingat, jadi itu bagus di konsol dan untuk peretasan cepat. Boleh dibilang tidak disambut dalam kode serius karena menutupi maksudnya.

(Berdasarkan komentar Piotr di jawaban Justicle di atas.)


1
Banyak, banyak terima kasih atas komentar ini :-) Ini adalah satu-satunya metode yang berfungsi jika Anda memiliki string panjang yang terlihat seperti paragraf.
Boomerange

12

Anda bisa mencoba ini

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

using : space: menghilangkan ruang non breaking bersama dengan ruang reguler.


1
Ini sebenarnya jawaban IMHO terbaik, seperti pada HTML liar &nbspdan spasi putih non-ASCII lainnya tidak akan dihapus oleh String#stripatau cocok dengan /\s/. Lihat bagian berjudul "Ekspresi kurung POSIX" di dokumen
Regexp

8

Gunakan gsub atau hapus. Perbedaannya adalah gsub bisa menghapus tab, sedangkan hapus tidak bisa. Terkadang Anda memiliki tab dalam file yang ditambahkan oleh editor.

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

Ada banyak cara:
Untuk menghapus spasi dari kedua sisi:

Jenis trim seperti php ()

Foo_bar.strip

Untuk menghapus semua ruang:

Foo_bar.gsub(/ /, "")

Untuk menghapus semua spasi putih:

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

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

tetapi ini hanya menghapus spaces, tidak semuawhite spaces
Gavriel

6

Metode gsub akan baik-baik saja.
Metode gsub dapat dipanggil pada sebuah string dan mengatakan:

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

Metode gsub mencari setiap kemunculan argumen pertama dan menggantinya dengan argumen kedua. Dalam hal ini, itu akan mengganti setiap ruang di dalam string dan menghapusnya.

Contoh lain:

b = "the white fox has a torn tail"

Mari kita ganti setiap kemunculan huruf "t" dengan huruf kapital "T"

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

5

Untuk perilaku yang sama persis dengan PHP trim, metode paling sederhana adalah dengan menggunakan String#stripmetode, seperti:

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

Ruby juga memiliki versi edit-di-tempat, juga disebut String.strip!(perhatikan trailing '!'). Ini tidak memerlukan pembuatan salinan string, dan dapat secara signifikan lebih cepat untuk beberapa penggunaan:

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

Kedua versi menghasilkan output ini:

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

Saya membuat tolok ukur untuk menguji kinerja beberapa penggunaan dasar stripdan strip!, serta beberapa alternatif. Tesnya adalah ini:

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

Ini hasilnya:

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

Preferensi pribadi saya menggunakan metode ini .tr

seperti dalam:

string = "this is a string to smash together"

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

Terima kasih kepada @FrankScmitt untuk menunjukkan bahwa untuk membuat ini hapus semua spasi putih (bukan hanya spasi) Anda harus menuliskannya seperti ini:

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

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

tetapi ini hanya menghapus spaces, bukanall white spaces
Gavriel

Untuk menghapus semua spasi putih (spasi, tab, baris baru), pertimbangkan untuk menggunakan s.tr(" \t\n", '').
Frank Schmitt

@ Gavriel - Saya salah membaca / salah paham pertanyaannya, terima kasih telah menunjukkannya.
Jeremy Gunter

@ FrankSchmitt Saya menambahkan koreksi Anda ke jawaban saya, untuk lebih tepat menjawab pertanyaan OP. Terima kasih telah mengoreksi saya.
Jeremy Gunter

3

Saya mencoba melakukan ini karena saya ingin menggunakan catatan "judul" sebagai id dalam tampilan tetapi judul memiliki spasi.

solusinya adalah:

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

1

Ruby .scan()dan .join()metode String juga dapat membantu mengatasi spasi putih dalam string.

scan(/\w+/).join akan menghapus semua spasi dan bergabung dengan string

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

Ini juga menghilangkan ruang dari bagian kiri dan kanan string. Berarti ltrim, rtrimdan trim. Untuk berjaga-jaga jika seseorang memiliki latar belakang lebih C, FoxProatau Visual Basicdan melompat 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 Terima kasih banyak telah menunjukkan poin kunci tambahan dari metode .scan (). Dihargai !!!
Dharmesh Rupani


1

Saya agak terlambat ke permainan, tapi saya menghapus spasi spasial dan memimpin dengan menggunakan strip! . Jika Anda memiliki array, seperti yang saya lakukan, saya perlu mengulangi melalui array dan menyimpannya setelah instance berakhir. Itu! mengurus ini. Ini menghapus semua spasi putih di akhir atau awal, bukan hanya yang pertama atau terakhir yang tertinggal.

Sebagai contoh:

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

Ini akan menghasilkan: ["halo", "Melanie", "adalah", "baru", "ke", "pemrograman"]. Saya selanjutnya mengeksplorasi / membagikan ini dalam video yang saya buat untuk menyoroti kode ini untuk pertanyaan serupa yang saya miliki .

Saya lebih baru untuk pemrograman dan menggunakan strip tidak berfungsi karena tidak menyimpannya ke array setelah loop berakhir.


0

Anda dapat mencoba ini:

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

untuk mendapatkan ini:

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

atau jika Anda ingin satu string, cukup gunakan:

"ab c d efg hi ".split.join
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.