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).

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

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.)


+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"

1
Ruby tidak menyiratkan Rails.
Volte

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

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]

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"


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.


1

Perbaikan jawaban EmFi.

string[/.{,#{n}}\z/m]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.