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.