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.