2010-02-01 45 views
81

Để có được n ký tự cuối cùng từ một chuỗi, tôi cho rằng bạn có thể sử dụngTrích xuất các nhân vật n cuối cùng từ một chuỗi ruby ​​

ending = string[-n..-1] 

nhưng nếu chuỗi là ít hơn n thư dài, bạn sẽ có được nil.

Giải pháp nào có sẵn?

Bối cảnh: Các chuỗi là ASCII đơn giản và tôi có quyền truy cập vào ruby ​​1.9.1 và tôi đang sử dụng các đối tượng Plain Old Ruby (không có khung web).

Trả lời

81

Ở đây bạn có một liner, bạn có thể đặt một số lớn hơn kích thước của chuỗi:

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

Đối với ruby ​​1.9+

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

Đối với ruby ​​2.0+, tham gia trở lại một string

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

Nếu bạn đang sử dụng phiên bản Ruby gần đây, bạn có thể sử dụng 'chars' thay vì chia nhỏ. –

+0

tính năng này không hoạt động với 1.9. Câu trả lời khác dường như mặc dù. – rogerdpack

+1

Tôi đã sử dụng "12345678910" .split (//). Last (7) .join.to_s –

13
ending = string.reverse[0...n].reverse 
+0

Đây là phương pháp tốt nhất mà tôi thấy trên trang này đáp ứng các yêu cầu của việc có thể cung cấp một độ dài kí tự kết thúc vượt quá tổng chiều dài chuỗi. Ví dụ: –

+0

Ví dụ: nếu bạn định dùng 3 ký tự cuối cùng của một nhóm stings như "abcde", "ab" và "a". Kỹ thuật này sẽ dẫn đến "cde", "ab" và "a" sử dụng cùng một mã cho mỗi. '" abcde ".reverse [0,3] .reverse' >>>" cde "' "ab" .reverse [0,3] .reverse' >>> "ab" '" a ".reverse [0, 3] .reverse' >>> "a" –

93

Vâng, cách giải quyết đơn giản nhất tôi có thể nghĩ đến là:

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

(EDIT: Các or điều hành có độ ưu tiên thấp hơn so với chuyển nhượng, vì vậy hãy chắc chắn sử dụng || thay thế.)

+0

+1 ... Tôi nghĩ cách này dễ đọc hơn 'string.reverse [0..n] .reverse', điều này cho tôi một giây" chờ đợi, tại sao anh ấy đang làm điều đó à? " (hoặc nếu tôi không đọc nó trong ngữ cảnh của câu hỏi này) – Arkaaito

+0

Đơn giản hơn nhiều so với regex của tôi. – EmFi

+4

Câu trả lời hay, nhưng nó phải là '||' thay vì 'hoặc', hoặc đặt dấu ngoặc đơn quanh' str [-n ..- 1] hoặc str'. –

5

Bạn đã thử một regex chưa?

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

Regex chụp nhiều ký tự có thể ở cuối chuỗi, nhưng không quá n. Và lưu trữ nó trong $ 1.

8

Để lấy các ký tự n cuối cùng từ chuỗi, bạn có thể làm điều này

a [-n, n] nếu a là mảng.

Đây là ví dụ nếu bạn muốn.

ruby-1.9.2-P180: 006> a = "911.234.567.890"

=> "911.234.567.890"

ruby-1.9.2-P180: 009> a [-5,5]

=> "67.890"

ruby-1.9.2-P180: 010> a [-7,7]

=> "4.567.890"

+0

Nếu số quá lớn, 'nil' được trả về, câu hỏi này đặc biệt cố gắng tránh. –

+0

Câu trả lời hay. Dọn dẹp. – Volte

1

Impr ovement trên câu trả lời của EmFi.

string[/.{,#{n}}\z/m] 
27

Trong Ruby thẳng (không Rails), bạn có thể làm

string.chars.last(n).join 

Ví dụ:

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" 

Nếu bạn đang sử dụng Ruby on Rails, bạn có thể gọi các phương thức firstlast trên đối tượng chuỗi. Những phương pháp này được ưa thích vì chúng gọn gàng và trực quan.

Ví dụ:

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

Tốt nhất. Cảm ơn. –

+0

Ruby không hàm ý Rails. Chỉ – Volte

7

Bạn có thể sử dụng đoạn mã sau:

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

mã - câu trả lời không phải lúc nào cũng hữu ích. giải thích tại sao/làm thế nào mã này là sửa chữa sẽ là tuyệt vời – ry8806

Các vấn đề liên quan