คำตอบ:
ในฐานะของ Ruby 2.5 คุณสามารถใช้delete_suffix
หรือdelete_suffix!
เพื่อให้บรรลุสิ่งนี้ในลักษณะที่รวดเร็วและอ่านได้
เอกสารเกี่ยวกับวิธีการที่มีที่นี่
หากคุณรู้ว่าคำต่อท้ายคืออะไรนี่เป็นสำนวน (และฉันขอโต้แย้งยิ่งอ่านง่ายกว่าคำตอบอื่น ๆ ที่นี่):
'abc123'.delete_suffix('123') # => "abc"
'abc123'.delete_suffix!('123') # => "abc"
มันเร็วยิ่งขึ้นอย่างมาก (เกือบ40%ด้วยวิธีปัง) กว่าคำตอบยอดนิยม นี่คือผลลัพธ์ของการวัดมาตรฐานเดียวกัน:
user system total real
chomp 0.949823 0.001025 0.950848 ( 0.951941)
range 1.874237 0.001472 1.875709 ( 1.876820)
delete_suffix 0.721699 0.000945 0.722644 ( 0.723410)
delete_suffix! 0.650042 0.000714 0.650756 ( 0.651332)
ฉันหวังว่าสิ่งนี้มีประโยชน์ - โปรดทราบว่าวิธีการนี้ไม่ได้รับการยอมรับจาก regex ดังนั้นหากคุณไม่ทราบว่าคำต่อท้ายจะไม่สามารถใช้งานได้ในขณะนี้ อย่างไรก็ตามในขณะที่คำตอบที่ยอมรับ ( อัปเดต: ณ เวลาที่เขียน ) กำหนดไว้เหมือนกันฉันคิดว่านี่อาจเป็นประโยชน์กับบางคน
What is the preferred way of removing the last n characters from a string?
irb> 'now is the time'[0...-4]
=> "now is the "
[0...-4]
ไม่ใช่[0..-4]
หากตัวละครที่คุณต้องการลบเป็นตัวละครเดียวกันเสมอให้พิจารณาchomp
:
'abc123'.chomp('123') # => "abc"
ข้อดีของchomp
คือ: ไม่นับและรหัสจะสื่อสารสิ่งที่กำลังทำอย่างชัดเจนยิ่งขึ้น
หากไม่มีข้อโต้แย้งให้chomp
ลบการลงท้ายบรรทัด DOS หรือ Unix หากมีอยู่:
"abc\n".chomp # => "abc"
"abc\r\n".chomp # => "abc"
จากความคิดเห็นมีคำถามเกี่ยวกับความเร็วในการใช้งาน#chomp
เมื่อเทียบกับการใช้ช่วง นี่คือมาตรฐานเปรียบเทียบทั้งสอง:
require 'benchmark'
S = 'asdfghjkl'
SL = S.length
T = 10_000
A = 1_000.times.map { |n| "#{n}#{S}" }
GC.disable
Benchmark.bmbm do |x|
x.report('chomp') { T.times { A.each { |s| s.chomp(S) } } }
x.report('range') { T.times { A.each { |s| s[0...-SL] } } }
end
ผลการทดสอบเกณฑ์มาตรฐาน (โดยใช้ CRuby 2.13p242):
Rehearsal -----------------------------------------
chomp 1.540000 0.040000 1.580000 ( 1.587908)
range 1.810000 0.200000 2.010000 ( 2.011846)
-------------------------------- total: 3.590000sec
user system total real
chomp 1.550000 0.070000 1.620000 ( 1.610362)
range 1.970000 0.170000 2.140000 ( 2.146682)
ดังนั้น chomp จึงเร็วกว่าการใช้ช่วงโดย ~ 22%
chomp!()
เพื่อดำเนินการกับ String แบบแทนที่
str = str[0...-n]
chop
ผมจะแนะนำ ฉันคิดว่ามันถูกกล่าวถึงในความคิดเห็น แต่ไม่มีลิงก์หรือคำอธิบายดังนั้นนี่คือเหตุผลที่ฉันคิดว่ามันจะดีกว่า:
มันเพียงลบอักขระตัวสุดท้ายออกจากสตริงและคุณไม่จำเป็นต้องระบุค่าใด ๆ ที่จะเกิดขึ้น
หากคุณต้องการลบตัวละครมากกว่าหนึ่งตัวchomp
นั่นเป็นทางออกที่ดีที่สุดของคุณ นี่คือสิ่งที่เอกสารทับทิมพูดถึงchop
:
ส่งคืนสตริงใหม่โดยลบอักขระตัวสุดท้ายออก หากสตริงลงท้ายด้วย \ r \ n อักขระทั้งสองตัวจะถูกลบออก การนำ chop ไปใช้กับสตริงว่างจะส่งคืนสตริงว่าง String # chomp มักจะเป็นทางเลือกที่ปลอดภัยกว่าเนื่องจากสตริงจะไม่เปลี่ยนแปลงหากไม่ได้อยู่ในตัวคั่นเร็กคอร์ด
แม้ว่าส่วนใหญ่จะใช้ในการลบตัวคั่นเช่น\r\n
ฉันใช้เพื่อลบอักขระตัวสุดท้ายออกจากสตริงอย่างง่ายตัวอย่างเช่นการs
สร้างคำเอกพจน์
name = "my text"
x.times do name.chop! end
ที่นี่ในคอนโซล:
>name = "Nabucodonosor"
=> "Nabucodonosor"
> 7.times do name.chop! end
=> 7
> name
=> "Nabuco"
การดร็อปn
อักขระตัวสุดท้ายเหมือนกับการเก็บlength - n
อักขระตัวแรก
การสนับสนุนที่แอ็คทีฟประกอบด้วยString#first
และString#last
วิธีการที่ให้วิธีที่สะดวกในการเก็บหรือวางn
อักขระตัวแรก / ตัวสุดท้าย
require 'active_support/core_ext/string/access'
"foobarbaz".first(3) # => "foo"
"foobarbaz".first(-3) # => "foobar"
"foobarbaz".last(3) # => "baz"
"foobarbaz".last(-3) # => "barbaz"
หากคุณใช้รางให้ลอง:
"my_string".last(2) # => "ng"
[แก้ไข]
วิธีรับสตริงโดยไม่มี 2 ตัวอักษรสุดท้าย:
n = "my_string".size
"my_string"[0..n-3] # => "my_stri"
หมายเหตุ: อักขระตัวสุดท้ายของสตริงอยู่ที่ n-1 ดังนั้นในการลบ 2 ครั้งสุดท้ายเราใช้ n-3
คุณสามารถใช้สิ่งที่ชอบ
"string".sub!(/.{X}$/,'')
ที่ไหนX
เป็นจำนวนตัวอักษรที่จะเอา
หรือด้วยการกำหนด / ใช้ผล:
myvar = "string"[0..-X]
โดยที่X
จำนวนอักขระบวกหนึ่งตัวที่จะลบ
ลองดูslice()
วิธีการ:
หากคุณตกลงกับการสร้างวิธีการเรียนและต้องการให้ตัวละครที่คุณตัดออกมาลองทำสิ่งนี้:
class String
def chop_multiple(amount)
amount.times.inject([self, '']){ |(s, r)| [s.chop, r.prepend(s[-1])] }
end
end
hello, world = "hello world".chop_multiple 5
hello #=> 'hello '
world #=> 'world'
ใช้ regex:
str = 'string'
n = 2 #to remove last n characters
str[/\A.{#{str.size-n}}/] #=> "stri"
หากตัวละครที่คุณต้องการลบเป็นตัวละครเดียวกันเสมอให้พิจารณา chomp:
'abc123' chomp ('123')
x = "my_test"
last_char = x.split('').last
delete_suffix
จาก Ruby 2.5 ข้อมูลเพิ่มเติมที่นี่