การแยกอักขระ n ตัวสุดท้ายออกจากสตริงทับทิม


105

ในการรับnอักขระสุดท้ายจากสตริงฉันคิดว่าคุณสามารถใช้

ending = string[-n..-1]

แต่ถ้าสตริงน้อยกว่าตัวอักษรนานคุณจะได้รับnnil

มีวิธีแก้ปัญหาอะไรบ้าง?

ความเป็นมา : สตริงเป็น ASCII ธรรมดาและฉันสามารถเข้าถึง Ruby 1.9.1 ได้และฉันใช้ Plain Old Ruby Objects (ไม่มีเว็บเฟรมเวิร์ก)

คำตอบ:


99

ที่นี่คุณมีซับเดียวคุณสามารถใส่ตัวเลขที่มากกว่าขนาดของสตริงได้:

"123".split(//).last(5).to_s

สำหรับทับทิม 1.9+

"123".split(//).last(5).join("").to_s

สำหรับ Ruby 2.0+ ให้ join ส่งคืนสตริง

"123".split(//).last(5).join

19
หากคุณใช้ Ruby เวอร์ชันล่าสุดคุณสามารถใช้charsแทนการแยกได้
Andrew Grimm

1
ฉันใช้ "12345678910" .split (//). last (7) .join.to_s
Hard-Boiled Wonderland

@ Hard-BoiledWonderland joinทำงาน ฉันไม่คิดว่าคุณต้องการคนสุดท้ายto_sถ้าคุณใช้การเข้าร่วม
Andrew Grimm

@AndrewGrimm คุณพูดถูกสำหรับกรณีนั้นฉันใช้ข้างต้นกับ Nokogiri n.xpath('ReferenceID').inner_text.split(//).last(7).join.to_s.to_iฉันต้องการ to_s เพื่อดำเนินการ to_i เพื่อแยกค่าตัวเลข
Hard-Boiled Wonderland

คุณขาด . join - ตอนนี้ส่งคืนอาร์เรย์ของสตริง แทนที่จะเป็น"123".split(//).last(5).join(Ruby 2.0.0)
Pavel Nikolov

115

วิธีแก้ปัญหาที่ง่ายที่สุดที่ฉันคิดได้คือ:

ending = str[-n..-1] || str

(แก้ไข: ตัวorดำเนินการมีลำดับความสำคัญต่ำกว่าการกำหนดดังนั้นอย่าลืมใช้||แทน)


+1 ... ฉันคิดว่าวิธีนี้อ่านง่ายกว่าstring.reverse[0..n].reverseซึ่งให้เวลา "รอทำไมเขาถึงทำอย่างนั้น" (หรือถ้าฉันไม่ได้อ่านในบริบทของคำถามนี้)
Arkaaito

4
คำตอบที่ดี แต่มันควรจะเป็น||แทนหรือใส่วงเล็บรอบor str[-n..-1] or str
Andrew Grimm

คำตอบที่ดี แต่ฉันไม่ชอบที่ทับทิมไม่ปฏิบัติต่อ s [-inf ..- 1] เหมือนกับ x [0..inf]
klochner

ขอขอบคุณที่แจ้งปัญหาลำดับความสำคัญของตัวดำเนินการ Andrew รับฉันทุกครั้ง
perimosocordiae

@perimosocordiae คุณไม่ใช่คนเดียว stackoverflow.com/questions/372652/…
Andrew Grimm

51

ใน Ruby ตรง (ไม่มี Rails) คุณสามารถทำได้

string.chars.last(n).join

ตัวอย่างเช่น:

2.4.1 :009 > a = 'abcdefghij'
 => "abcdefghij"
2.4.1 :010 > a.chars.last(5).join
 => "fghij"
2.4.1 :011 > a.chars.last(100).join
 => "abcdefghij"

หากคุณใช้ Ruby on Rails คุณสามารถเรียกใช้เมธอดfirstและlastบนออบเจ็กต์สตริงได้ วิธีการเหล่านี้เป็นที่ต้องการเนื่องจากมีความกระชับและใช้งานง่าย

ตัวอย่างเช่น:

[1] pry(main)> a = 'abcdefg'                                                                                                                
 => "abcdefg"
[2] pry(main)> a.first(3)                                                                                                                   
 => "abc"
[3] pry(main)> a.last(4)                                                                                                                    
 => "defg"

1
Ruby ไม่ได้หมายถึง Rails
Volte

14
ending = string.reverse[0...n].reverse

นี่เป็นแนวทางที่ดีที่สุดที่ฉันเห็นในหน้านี้ซึ่งเป็นไปตามข้อกำหนดในการระบุความยาวอักขระสิ้นสุดที่เกินความยาวสตริงทั้งหมด
Rob.Kachmar

1
ตัวอย่างเช่นหากคุณตั้งใจจะใช้อักขระ 3 ตัวสุดท้ายของกลุ่มการต่อยเช่น "abcde" "ab" และ "a" เทคนิคนี้จะส่งผลให้ "cde" "ab" และ "a" ใช้รหัสเดียวกันสำหรับแต่ละรหัส "abcde".reverse[0,3].reverse>>> "cde" "ab".reverse[0,3].reverse>>> "ab" "a".reverse[0,3].reverse>>> "a"
Rob.Kachmar

9

คุณสามารถใช้รหัสต่อไปนี้:

string[string.length-n,string.length]

1
รหัสเท่านั้น - คำตอบอาจไม่เป็นประโยชน์เสมอไป อธิบายว่าทำไม / วิธีการแก้ไขรหัสนี้จะดี
ry8806

6

หากต้องการรับ n อักขระสุดท้ายจากสตริงคุณสามารถทำได้

a [-n, n] ถ้า a คืออาร์เรย์

นี่คือตัวอย่างและหากคุณต้องการ

ทับทิม -1.9.2-p180: 006> a = "911234567890"

=> "911234567890"

ทับทิม -1.9.2-p180: 009> a [-5,5]

=> "67890"

ทับทิม -1.9.2-p180: 010> a [-7,7]

=> "4567890"


หากตัวเลขใหญ่เกินไปnilจะถูกส่งกลับซึ่งเป็นสิ่งที่คำถามนี้พยายามหลีกเลี่ยงโดยเฉพาะ
Andrew Grimm

คำตอบที่ดี. ทำความสะอาด.
Volte

เหตุใดจึงได้รับการโหวตเพิ่มขึ้น มีปัญหาเดียวกันกับที่ OP ถามว่าจะแก้ไขอย่างไร
jeffdill2

5

คุณลอง regex แล้วหรือยัง?

string.match(/(.{0,#{n}}$)/)
ending=$1

regex จับอักขระได้มากที่สุดเท่าที่จะทำได้ในตอนท้ายของสตริง แต่ไม่เกิน n และเก็บไว้ในราคา $ 1


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.