Mengekstrak karakter n terakhir dari string ruby

105

Untuk mendapatkan nkarakter terakhir dari sebuah string, saya berasumsi Anda bisa menggunakan

ending = string[-n..-1]

tetapi jika panjang string kurang dari nhuruf, Anda mendapatkan nil.

Solusi apa yang tersedia?

Latar belakang : Stringnya adalah ASCII biasa, dan saya memiliki akses ke ruby ​​1.9.1, dan saya menggunakan Objek Ruby Tua Biasa (tanpa kerangka kerja web).

Andrew Grimm
sumber

Jawaban:

99

Di sini Anda memiliki satu liner, Anda dapat memasukkan angka yang lebih besar dari ukuran string:

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

Untuk ruby ​​1.9+

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

Untuk ruby ​​2.0+, join mengembalikan string

"123".split(//).last(5).join
Gareve
sumber
19
Jika Anda menggunakan Ruby versi terbaru, Anda dapat menggunakan charssebagai pengganti split.
Andrew Grimm
1
Saya menggunakan "12345678910" .split (//). Last (7) .join.to_s
Hard-Boiled Wonderland
@ joinKarya Hard-BoiledWonderland . Saya tidak berpikir Anda membutuhkan yang terakhir to_sjika Anda menggunakan join.
Andrew Grimm
@AndrewGrimm Anda benar, untuk kasus itu saya menggunakan di atas dengan Nokogiri n.xpath('ReferenceID').inner_text.split(//).last(7).join.to_s.to_isaya membutuhkan to_s untuk melakukan to_i untuk mengekstrak nilai numerik.
Hard-Boiled Wonderland
Anda kehilangan .join - sekarang mengembalikan array string. Sebaliknya seharusnya "123".split(//).last(5).join(Ruby 2.0.0)
Pavel Nikolov
115

Nah, solusi termudah yang dapat saya pikirkan adalah:

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

(EDIT: orOperator memiliki prioritas lebih rendah daripada tugas, jadi pastikan untuk menggunakan ||sebagai gantinya.)

perimosocordiae
sumber
+1 ... Saya rasa cara ini lebih mudah dibaca daripada string.reverse[0..n].reverse, yang memberi saya sedetik "tunggu, kenapa dia melakukan itu?" (atau akankah jika saya tidak membacanya dalam konteks pertanyaan ini)
Arkaaito
4
Jawaban yang bagus, tetapi seharusnya ||bukan or, atau beri tanda kurung str[-n..-1] or str.
Andrew Grimm
Jawaban bagus, tapi saya tidak suka ruby ​​itu tidak memperlakukan s [-inf ..- 1] sama dengan x [0..inf]
klochner
Terima kasih telah memperhatikan masalah prioritas operator, Andrew. Mendapatkan saya setiap saat.
perimosocordiae
@jamur_kamu bukan satu-satunya. stackoverflow.com/questions/372652/…
Andrew Grimm
51

Di Ruby langsung (tanpa Rails), Anda bisa melakukannya

string.chars.last(n).join

Sebagai contoh:

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"

Jika Anda menggunakan Ruby on Rails, Anda dapat memanggil metode firstdan lastobjek string. Metode ini lebih disukai karena ringkas dan intuitif.

Sebagai contoh:

[1] pry(main)> a = 'abcdefg'                                                                                                                
 => "abcdefg"
[2] pry(main)> a.first(3)                                                                                                                   
 => "abc"
[3] pry(main)> a.last(4)                                                                                                                    
 => "defg"
Zack Xu
sumber
1
Ruby tidak menyiratkan Rails.
Volte
14
ending = string.reverse[0...n].reverse
Andrew Grimm
sumber
Ini adalah pendekatan terbaik yang saya lihat di halaman ini yang memenuhi persyaratan untuk dapat menyediakan panjang karakter akhir yang melebihi total panjang string.
Rob. Kachmar
1
Misalnya, jika Anda bermaksud mengambil 3 karakter terakhir dari grup sengatan seperti "abcde", "ab", dan "a". Teknik ini akan menghasilkan "cde", "ab", dan "a" menggunakan kode yang sama untuk masing-masing. "abcde".reverse[0,3].reverse>>> "cde" "ab".reverse[0,3].reverse>>> "ab" "a".reverse[0,3].reverse>>> "a"
Rob.Kachmar
9

Anda dapat menggunakan kode berikut:

string[string.length-n,string.length]
rurkss
sumber
1
hanya kode - jawaban tidak selalu membantu. menjelaskan mengapa / bagaimana kode ini memperbaikinya akan sangat bagus
ry8806
6

Untuk mendapatkan n karakter terakhir dari sebuah string, Anda bisa melakukan ini

a [-n, n] jika a adalah array.

Ini dan contoh jika Anda menginginkannya.

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"

Sunil
sumber
Jika angkanya terlalu besar, nildikembalikan, yang secara khusus ingin dihindari oleh pertanyaan ini.
Andrew Grimm
Jawaban yang bagus. Bersih.
Volte
Mengapa ini mendapatkan suara positif? Ini memiliki masalah yang sama persis dengan apa yang diminta OP bagaimana memperbaikinya.
jeffdill2
5

Sudahkah Anda mencoba regex?

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

Regex menangkap sebanyak mungkin karakter di akhir string, tetapi tidak lebih dari n. Dan menyimpannya dalam $ 1.

EmFi
sumber
1

Perbaikan jawaban EmFi.

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