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  ), 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+/, "").
\ 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
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.)
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#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/…
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)
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.
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"
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"
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.
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.
Ini sebenarnya jawaban IMHO terbaik, seperti pada HTML liar  dan 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"
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
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!]:40Updated[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.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)
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"
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 >
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.
trim()
mengosongkan spasi putih " dari awal dan akhir sebuah string " (sebagaimana dinyatakan dalam dokumentasi ), PHP tidak menghapus "semua spasi putih".String#strip
atau mencocokkan/\s+/
hanya akan menghapus spasi ASCII. Jika Anda ingin memastikan spasi kosong non-ASCII juga ditangkap (mis. HTML 
), lihat jawaban aneh yang tidak populer dari @EBooker.Jawaban:
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+/, "")
.sumber
Dan untuk meniru
trim()
fungsi PHP :sumber
.delete(' ').delete('\t').delete('\n') ...
, yang terlalu bertele-tele dan memberikan banyak peluang untuk kesalahan ketik dan kesalahan penghilangan.trim()
tentu saja tidak menghapus baris baru dan karakter spasi putih lainnya. Anda memilih satu interpretasi dari pertanyaan yang tidak jelas.delete()
panggilan.)Jawaban terkait:
kembali
sumber
nil
, pastikan untuk menjalankan.to_s
metode sebelum menjalankan strip sehingga metode strip tidak menimbulkan kesalahan. Ex.str=nil; str.to_s.strip #=> ""
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 (\n
atau\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.sumber
\s
menggunakan tanda kutip, bukan garis miring. Juga saya tidak dapat menemukan disebutkan dalam dokumentasi yang menghapus dapat mengambil regex sebagai argumen.#delete
dikatakan bekerja mirip dengan#count
. Anda dapat mencobanya di konsol juga.#strip
tidak. Lihat stackoverflow.com/questions/4859438/…Hapus bekerja lebih cepat =)
sumber
spaces
, tidak semuawhite spaces
delete(" \t\r\n")
akan menangani spasi putih yang khas, dan masih lebih cepat dari gsub.Jika Anda menggunakan Rails / ActiveSupport , Anda dapat menggunakan
squish
metode. Ini menghilangkan ruang putih di kedua ujung string dan mengelompokkan beberapa ruang putih ke ruang tunggal.Untuk misalnya.
akan menghasilkan:
Periksa referensi ini dari api.rubyonrails.org .
sumber
require 'active_support/core_ext/string/filters'
"a \t \n \f \r \v b".squish == "a b"
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:
sumber
squish
metode Rails : apidock.com/rails/String/squishsqueeze(" ")
mungkin berhasil..strip
Metode Ruby melakukan setara dengan PHPtrim()
.Untuk menghapus semua spasi putih:
@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.
Mengutip: http://apidock.com/rails/String/squish
sumber
"good men".squeeze.strip
akan kembali"god men"
Ini akan menghapus ruang sisi kiri & kanan. Kode ini akan memberi kita:
"Raheem Shaik"
sumber
Juga jangan lupa:
sumber
[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
split.join
akan meledakkan semua ruang di manapun di string.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.)
sumber
Anda bisa mencoba ini
using : space: menghilangkan ruang non breaking bersama dengan ruang reguler.
sumber
 
dan spasi putih non-ASCII lainnya tidak akan dihapus olehString#strip
atau cocok dengan/\s/
. Lihat bagian berjudul "Ekspresi kurung POSIX" di dokumenGunakan gsub atau hapus. Perbedaannya adalah gsub bisa menghapus tab, sedangkan hapus tidak bisa. Terkadang Anda memiliki tab dalam file yang ditambahkan oleh editor.
sumber
Ada banyak cara:
Untuk menghapus spasi dari kedua sisi:
Untuk menghapus semua ruang:
Untuk menghapus semua spasi putih:
sumber
sumber
spaces
, tidak semuawhite spaces
Metode gsub akan baik-baik saja.
Metode gsub dapat dipanggil pada sebuah string dan mengatakan:
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:
Mari kita ganti setiap kemunculan huruf "t" dengan huruf kapital "T"
sumber
Untuk perilaku yang sama persis dengan PHP
trim
, metode paling sederhana adalah dengan menggunakanString#strip
metode, seperti: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:Kedua versi menghasilkan output ini:
Saya membuat tolok ukur untuk menguji kinerja beberapa penggunaan dasar
strip
danstrip!
, serta beberapa alternatif. Tesnya adalah ini:Ini hasilnya:
sumber
Preferensi pribadi saya menggunakan metode ini
.tr
seperti dalam:
Terima kasih kepada @FrankScmitt untuk menunjukkan bahwa untuk membuat ini hapus semua spasi putih (bukan hanya spasi) Anda harus menuliskannya seperti ini:
sumber
spaces
, bukanall white spaces
s.tr(" \t\n", '')
.Saya mencoba melakukan ini karena saya ingin menggunakan catatan "judul" sebagai id dalam tampilan tetapi judul memiliki spasi.
solusinya adalah:
sumber
Ruby
.scan()
dan.join()
metode String juga dapat membantu mengatasi spasi putih dalam string.scan(/\w+/).join
akan menghapus semua spasi dan bergabung dengan stringIni juga menghilangkan ruang dari bagian kiri dan kanan string. Berarti
ltrim
,rtrim
dantrim
. Untuk berjaga-jaga jika seseorang memiliki latar belakang lebihC
,FoxPro
atauVisual Basic
dan melompatRuby
.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 >
sumber
Saya akan menggunakan sesuatu seperti ini:
sumber
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:
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.
sumber
Anda dapat mencoba ini:
untuk mendapatkan ini:
atau jika Anda ingin satu string, cukup gunakan:
sumber