Jawaban:
Anda dapat menggunakan metode slice:
a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"
ada yang bukan '!' versi juga. Info lebih lanjut dapat dilihat di dokumentasi tentang versi lain juga: http://www.ruby-doc.org/core/classes/String.html#method-i-slice-21
"foobar".tap{|s| s.slice!("foo")}.upcase
deletetidak akan berfungsi, karena menghapus semua karakter yang Anda masukkan :'hello world'.delete('hello') #=> ' wrd'
Bagaimana str.gsub("subString", "")
dengan Ruby Doc
subakan lebih tepat daripada gsub, karena OP hanya ingin menghapus substring dari awal string, tidak semua melalui string (lihat kode contohnya). Dan menggunakan regex, seperti ini, akan lebih baik: str.sub(/^subString/, '')- karena memastikan bahwa substring pasti akan dihapus hanya dari awal.
subStringtidak memasukkan karakter khusus regex.
/^subString/adalah literal, jadi kita bisa sangat yakin itu tidak termasuk karakter metachar. Jika Anda mengganti beberapa string lain dalam regex, Anda dapat melakukan ini: /#{Regexp.escape(str)}/.
Regexp.escape().
Jika ini adalah akhir dari string, Anda juga dapat menggunakan chomp:
"hello".chomp("llo") #=> "he"
chompdalam kombinasi dengan reverse:"hello".reverse.chomp("he".reverse).reverse #=> "llo"
Jika Anda hanya memiliki satu kemunculan string target yang dapat Anda gunakan:
str[target] = ''
atau
str.sub(target, '')
Jika Anda memiliki beberapa kejadian penggunaan target:
str.gsub(target, '')
Misalnya:
asdf = 'foo bar'
asdf['bar'] = ''
asdf #=> "foo "
asdf = 'foo bar'
asdf.sub('bar', '') #=> "foo "
asdf = asdf + asdf #=> "foo barfoo bar"
asdf.gsub('bar', '') #=> "foo foo "
Jika Anda perlu melakukan penggantian di tempat, gunakan "!"versi gsub!dan sub!.
asdf['bar'] = ''
Jika Anda menggunakan Rails, ada juga remove .
Misalnya "Testmessage".remove("message")hasil"Test" .
Peringatan: metode ini menghilangkan semua kejadian
slicemetode ini tidak mengembalikan bagian dari tali yang diiris, itu mengembalikan "pisau"
slice! def gimme_the_slice(my_string, my_slice) my_string.slice!(my_slice) my_string
Jika substring Anda ada di awal di akhir string, maka Ruby 2.5 telah memperkenalkan metode untuk ini:
Jika Anda menggunakan rel atau dengan dukungan kurang aktif Anda mendapat String # remove dan String # remove! metode
def remove!(*patterns)
patterns.each do |pattern|
gsub! pattern, ""
end
self
end
sumber: http://api.rubyonrails.org/classes/String.html#method-i-remove
Jika saya menafsirkan dengan benar, pertanyaan ini sepertinya menanyakan sesuatu seperti operasi minus (-) di antara string, yaitu kebalikan dari operasi built-in plus (+) (gabungan).
Tidak seperti jawaban sebelumnya, saya mencoba mendefinisikan operasi yang harus mematuhi properti:
JIKA c = a + b THEN c - a = b DAN c - b = a
Kami hanya membutuhkan tiga metode Ruby bawaan untuk mencapai ini:
'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'.
Saya tidak akan menjelaskan cara kerjanya karena dapat dengan mudah dipahami menjalankan satu metode pada satu waktu.
Berikut ini adalah bukti kode konsep:
# minus_string.rb
class String
def -(str)
partition(str).values_at(0,2).join
end
end
# Add the following code and issue 'ruby minus_string.rb' in the console to test
require 'minitest/autorun'
class MinusString_Test < MiniTest::Test
A,B,C='abra','cadabra','abracadabra'
def test_C_eq_A_plus_B
assert C == A + B
end
def test_C_minus_A_eq_B
assert C - A == B
end
def test_C_minus_B_eq_A
assert C - B == A
end
end
Satu kata nasihat terakhir jika Anda menggunakan versi Ruby terbaru (> = 2.0): gunakan Penyempitan alih-alih String monyet-patching seperti pada contoh sebelumnya.
Semudah:
module MinusString
refine String do
def -(str)
partition(str).values_at(0,2).join
end
end
end
dan tambahkan using MinusStringsebelum blok di mana Anda membutuhkannya.
inilah yang akan saya lakukan
2.2.1 :015 > class String; def remove!(start_index, end_index) (end_index - start_index + 1).times{ self.slice! start_index }; self end; end;
2.2.1 :016 > "idliketodeleteHEREallthewaytoHEREplease".remove! 14, 32
=> "idliketodeleteplease"
2.2.1 :017 > ":)".remove! 1,1
=> ":"
2.2.1 :018 > "ohnoe!".remove! 2,4
=> "oh!"
Diformat dalam beberapa baris:
class String
def remove!(start_index, end_index)
(end_index - start_index + 1).times{ self.slice! start_index }
self
end
end
def replaceslug
slug = "" + name
@replacements = [
[ "," , ""],
[ "\\?" , ""],
[ " " , "-"],
[ "'" , "-"],
[ "Ç" , "c"],
[ "Ş" , "s"],
[ "İ" , "i"],
[ "I" , "i"],
[ "Ü" , "u"],
[ "Ö" , "o"],
[ "Ğ" , "g"],
[ "ç" , "c"],
[ "ş" , "s"],
[ "ı" , "i"],
[ "ü" , "u"],
[ "ö" , "o"],
[ "ğ" , "g"],
]
@replacements.each do |pair|
slug.gsub!(pair[0], pair[1])
end
self.slug = slug.downcase
end
Ömisalnya.
[]s untuk versi non-bang.