ฉันแค่สงสัยว่ามีวิธีใดที่จะลบสายจากสายอื่นหรือไม่ บางสิ่งเช่นนี้
class String
def remove(s)
self[s.length, self.length - s.length]
end
end
ฉันแค่สงสัยว่ามีวิธีใดที่จะลบสายจากสายอื่นหรือไม่ บางสิ่งเช่นนี้
class String
def remove(s)
self[s.length, self.length - s.length]
end
end
คำตอบ:
คุณสามารถใช้วิธีการแบ่ง:
a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"
มีไม่ใช่ '!' รุ่นเช่นกัน ข้อมูลเพิ่มเติมสามารถดูได้ในเอกสารเกี่ยวกับรุ่นอื่นเช่นกัน: http://www.ruby-doc.org/core/classes/String.html#method-i-slice-21
"foobar".tap{|s| s.slice!("foo")}.upcase
delete
ไม่ทำงานเพราะจะลบตัวละครทุกตัวที่คุณผ่าน:'hello world'.delete('hello') #=> ' wrd'
วิธีการเกี่ยวกับstr.gsub("subString", "")
ตรวจสอบทับทิมหมอ
sub
จะเหมาะสมกว่าgsub
เนื่องจาก OP ต้องการเพียงลบสตริงย่อยจากจุดเริ่มต้นของสตริงไม่ใช่ทั้งหมดผ่านสตริง (ดูที่โค้ดตัวอย่างของเขา) และการใช้ regex เช่นนี้จะดีกว่า: str.sub(/^subString/, '')
- เพราะทำให้มั่นใจได้ว่าสตริงย่อยจะถูกลบออกจากจุดเริ่มต้นเท่านั้น
subString
จะไม่มีตัวอักษรพิเศษ regex
/^subString/
นี้เป็นตัวอักษรดังนั้นเราจึงมั่นใจได้ว่ามันจะไม่รวม metacharacters หากคุณกำลังแทนบางสายอื่น ๆ เข้าไปใน regex /#{Regexp.escape(str)}/
คุณสามารถทำสิ่งนี้:
Regexp.escape()
แม้ว่า
หากเป็นจุดสิ้นสุดของสตริงคุณสามารถใช้chomp
:
"hello".chomp("llo") #=> "he"
chomp
ร่วมกับreverse
:"hello".reverse.chomp("he".reverse).reverse #=> "llo"
หากคุณมีสตริงเป้าหมายเพียงครั้งเดียวคุณสามารถใช้:
str[target] = ''
หรือ
str.sub(target, '')
หากคุณมีการใช้เป้าหมายหลายครั้ง:
str.gsub(target, '')
ตัวอย่างเช่น
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 "
หากคุณต้องการที่จะทำในสถานที่แทนใช้"!"
รุ่นและgsub!
sub!
asdf['bar'] = ''
หากคุณใช้ Rails ก็มีเช่นremove
กัน
เช่นอัตราผลตอบแทน"Testmessage".remove("message")
"Test"
คำเตือน: วิธีนี้จะลบสิ่งที่เกิดขึ้นทั้งหมด
slice
วิธีการไม่ส่งคืนส่วนของสตริงที่ถูกแบ่งออก แต่จะส่งคืน "มีด"
slice!
def gimme_the_slice(my_string, my_slice) my_string.slice!(my_slice) my_string
หากสตริงย่อยของคุณอยู่ที่จุดเริ่มต้นของในตอนท้ายของสตริงแล้ว Ruby 2.5 ได้แนะนำวิธีการนี้:
หากคุณกำลังใช้ Rails หรืออย่างน้อย Activesupport คุณจะได้ String # remove และ String # remove! วิธี
def remove!(*patterns)
patterns.each do |pattern|
gsub! pattern, ""
end
self
end
แหล่งที่มา: http://api.rubyonrails.org/classes/String.html#method-i-remove
หากฉันตีความถูกต้องคำถามนี้ดูเหมือนจะถามถึงการดำเนินการลบ (-) ระหว่างสตริงนั่นคือตรงกันข้ามกับการดำเนินการบวก (+) ในตัว (การต่อข้อมูล)
ไม่เหมือนกับคำตอบก่อนหน้านี้ฉันพยายามกำหนดการดำเนินการที่ต้องปฏิบัติตามคุณสมบัติ:
หาก c = a + b จากนั้น c - a = b และ c - b = a
เราต้องการเมธอด Ruby ในตัวเพียงสามตัวเท่านั้น
'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'
.
ฉันจะไม่อธิบายวิธีการทำงานเพราะสามารถเข้าใจวิธีใช้งานได้ครั้งละหนึ่งวิธี
นี่คือหลักฐานของรหัสแนวคิด:
# 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
คำแนะนำสุดท้ายหนึ่งคำหากคุณใช้ Ruby รุ่นล่าสุด (> = 2.0): ใช้การปรับแต่งแทนการใช้โปรแกรมปรับปรุงสตริงเหมือนในตัวอย่างก่อนหน้า
มันง่ายเหมือน:
module MinusString
refine String do
def -(str)
partition(str).values_at(0,2).join
end
end
end
และเพิ่มusing MinusString
ก่อนบล็อกที่คุณต้องการ
นี่คือสิ่งที่ฉันจะทำ
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!"
จัดรูปแบบในหลายบรรทัด:
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
Ö
ตัวอย่างเช่น
[]
s สำหรับรุ่นที่ไม่ใช่ผลกำไร