Trích xuất n ký tự cuối cùng từ một chuỗi ruby


105

Để lấy các nký tự cuối cùng từ một chuỗi, tôi cho rằng bạn có thể sử dụng

ending = string[-n..-1]

nhưng nếu chuỗi ndài hơn các chữ cái, bạn sẽ nhận được nil.

Có những giải pháp thay thế nào?

Thông tin cơ bản : Các chuỗi là ASCII thuần túy và tôi có quyền truy cập vào ruby ​​1.9.1 và tôi đang sử dụng Plain Old Ruby Objects (không có khuôn khổ web).

Câu trả lời:


99

Ở đây bạn có một lớp lót, 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ả về một chuỗi

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

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

1
Tôi đã sử dụng "12345678910" .split (//). Last (7) .join.to_s
Hard-Boiled Wonderland

@ Hard-BoiledWonderland joinhoạt động. Tôi không nghĩ rằng bạn cần cuối cùng to_snếu bạn sử dụng tham gia.
Andrew Grimm

@AndrewGrimm Bạn nói đúng, đối với trường hợp đó, tôi đã sử dụng ở trên với Nokogiri, n.xpath('ReferenceID').inner_text.split(//).last(7).join.to_s.to_itôi cần to_s để thực hiện to_i để trích xuất giá trị số.
Hard-Boiled Wonderland

Bạn đang thiếu .join - bây giờ nó trả về một mảng các chuỗi. Thay vào đó, nên "123".split(//).last(5).join(Ruby 2.0.0)
Pavel Nikolov

115

Chà, cách giải quyết dễ dàng nhất mà tôi có thể nghĩ đến là:

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

(CHỈNH SỬA: orToán tử có mức độ ưu tiên thấp hơn phép gán, vì vậy hãy đảm bảo sử dụng ||thay thế.)


+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ờ đã, tại sao anh ấy lại làm như vậy?" (hoặc nếu tôi không đọc nó trong ngữ cảnh của câu hỏi này)
Arkaaito

4
Câu trả lời tốt, nhưng nó nên được ||thay vì orhoặc đặt dấu ngoặc đơn xung quanh str[-n..-1] or str.
Andrew Grimm

Câu trả lời hay, nhưng tôi không thích rằng ruby ​​không đối xử với s [-inf ..- 1] giống như x [0..inf]
klochner

Cảm ơn bạn đã lưu ý vấn đề ưu tiên của nhà điều hành, Andrew. Cho tôi mọi lúc.
perimosocordiae

@perimosocordiae bạn không phải là người duy nhất. stackoverflow.com/questions/372652/…
Andrew Grimm

51

Trong Ruby thẳng (không có 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 một đối tượng chuỗi. Những phương pháp này được ưa thích hơn vì chúng ngắn gọn 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"

1
Ruby không ngụ ý Rails.
Volte

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

Đây là cách tốt nhất mà tôi thấy trên trang này đáp ứng yêu cầu có thể cung cấp độ dài ký tự kết thúc vượt quá tổng độ dài chuỗi.
Rob.Kachmar

1
Ví dụ: nếu bạn đang có ý định lấy 3 ký tự cuối cùng của một nhóm vết đốt 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"
Rob.Kachmar

9

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

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

1
chỉ 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 / cách mã này là việc sửa chữa sẽ là tuyệt vời
ry8806

6

Để lấy n ký tự cuối cùng từ mộ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à ví dụ nếu bạn muốn một cái.

ruby-1.9.2-p180: 006> a = "911234567890"

=> "911234567890"

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

=> "67890"

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

=> "4567890"


Nếu số lượng quá lớn, nilsẽ được trả về, đó là điều mà câu hỏi này đặc biệt cố gắng tránh.
Andrew Grimm

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

Tại sao điều này nhận được sự ủng hộ? Nó có cùng một vấn đề như những gì OP đã yêu cầu cách khắc phục.
jeffdill2

5

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

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

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


1

Cải thiện câu trả lời của EmFi.

string[/.{,#{n}}\z/m]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.