Ruby dizesinden son n karakteri çıkarmak


105

nBir dizeden son karakterleri almak için kullanabileceğinizi varsaydım

ending = string[-n..-1]

ama dize nharflerden daha kısa ise , elde edersiniz nil.

Hangi geçici çözümler mevcuttur?

Arka plan : Dizeler düz ASCII ve Ruby 1.9.1'e erişimim var ve Düz Eski Ruby Nesneleri kullanıyorum (web çerçevesi yok).

Yanıtlar:


99

Burada bir satırınız var, dizenin boyutundan büyük bir sayı girebilirsiniz:

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

Ruby 1.9+ için

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

Ruby 2.0+ için join bir dize döndürür

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

19
Ruby'nin yeni bir sürümünü kullanıyorsanız chars, split yerine kullanabilirsiniz .
— Andrew Grimm

1
"12345678910" .split (//). Last (7) .join.to_s
— Hard-Boiled Wonderland

@ Hard-BoiledWonderland joinçalışır. to_sJoin kullanırsan sonuncuya ihtiyacın olduğunu sanmıyorum .
— Andrew Grimm

@AndrewGrimm Haklısınız, bu durumda yukarıdakileri Nokogiri ile kullandım n.xpath('ReferenceID').inner_text.split(//).last(7).join.to_s.to_i, to_i'yi sayısal değeri çıkarmak için to_s'ye ihtiyacım vardı.
— Hard-Boiled Wonderland

Sen eksik .join şimdi dizeleri dizisi döndürür -. Bunun yerine "123".split(//).last(5).join(Ruby 2.0.0) olmalıdır
— Pavel Nikolov

115

Aklıma gelen en kolay çözüm şudur:

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

(DÜZENLE: orOperatör atamadan daha düşük önceliğe sahiptir, bu nedenle ||bunun yerine kullandığınızdan emin olun .)


+1 ... Sanırım bu şekilde okumak daha kolay string.reverse[0..n].reverse, bu da bana bir saniye "bekle, bunu neden yapıyor?" (ya da ben bu sorunu bağlamında okumaya değildi olsaydı)
— Arkaaito

4
İyi cevap, ama ||yerine orveya parantez içine alınmalıdır str[-n..-1] or str.
— Andrew Grimm

Güzel yanıt, ama yakutun [-inf ..- 1] 'e x [0..inf] ile aynı şekilde davranmaması hoşuma gitmiyor
— klochner

Operatör öncelik sorununu not ettiğiniz için teşekkürler Andrew. Beni her zaman etkiler.
— perimosocordiae

@perimosocordiae tek değilsin. stackoverflow.com/questions/372652/…
— Andrew Grimm

51

Düz Ruby'de (Raylar olmadan) şunları yapabilirsiniz:

string.chars.last(n).join

Örneğin:

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"

Ruby on Rails kullanıyorsanız, yöntemleri firstve lastbir dizge nesnesini çağırabilirsiniz . Bu yöntemler özlü ve sezgisel oldukları için tercih edilir.

Örneğin:

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

1
Ruby, Rails anlamına gelmez.
— Volte

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

Bu sayfada gördüğüm en iyi yaklaşım, toplam dize uzunluğunu aşan bir son karakter uzunluğu sağlayabilme gereksinimini karşılayan yaklaşımdır.
— Rob.Kachmar

1
Örneğin, "abcde", "ab" ve "a" gibi bir grup sokmanın son 3 karakterini almayı planlıyorsanız. Bu teknik, her biri için aynı kodu kullanan "cde", "ab" ve "a" ile sonuçlanacaktır. "abcde".reverse[0,3].reverse>>> "cde" "ab".reverse[0,3].reverse>>> "ab" "a".reverse[0,3].reverse>>> "a"
— Rob.Kachmar

9

Aşağıdaki kodu kullanabilirsiniz:

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

1
yalnızca kod - yanıtlar her zaman yardımcı olmaz. Bu kodun neden / nasıl düzeltildiğini açıklamak harika olurdu
— ry8806

6

Bir dizeden son n karakteri almak için bunu yapabilirsiniz

a [-n, n] eğer a dizi ise.

İsterseniz işte ve örnek.

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

=> "911234567890"

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

=> "67890"

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

=> "4567890"


Sayı çok büyükse nildöndürülür, bu sorunun özellikle kaçınmaya çalıştığı şey buydu.
— Andrew Grimm

İyi cevap. Temiz.
— Volte

Bu neden artı oy alıyor? OP'nin nasıl düzeltileceğini sorduğu sorunla aynı sorun var.
— jeffdill2

5

Normal ifadeyi denediniz mi?

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

Normal ifade, dizenin sonunda alabildiği kadar çok karakteri yakalar, ancak n'den fazla olamaz. Ve 1 dolara saklar.


1

EmFi'nin cevabında iyileştirme.

string[/.{,#{n}}\z/m]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.