Extrahieren der letzten n Zeichen aus einer Ruby-Zeichenfolge

105

Um die letzten nZeichen aus einer Zeichenfolge zu erhalten, habe ich angenommen, dass Sie sie verwenden können

ending = string[-n..-1]

aber wenn die Zeichenfolge weniger als nBuchstaben lang ist, erhalten Sie nil.

Welche Problemumgehungen sind verfügbar?

Hintergrund : Die Zeichenfolgen sind ASCII-Zeichenfolgen, ich habe Zugriff auf Ruby 1.9.1 und verwende einfache alte Ruby-Objekte (keine Webframeworks).

Andrew Grimm
quelle

Antworten:

99

Hier haben Sie einen Einzeiler, Sie können eine Zahl eingeben, die größer als die Größe der Zeichenfolge ist:

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

Für Rubin 1.9+

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

Bei Ruby 2.0+ gibt join einen String zurück

"123".split(//).last(5).join
Gareve
quelle
19
Wenn Sie eine neuere Version von Ruby verwenden, können Sie diese charsanstelle von split verwenden.
Andrew Grimm
1
Ich habe "12345678910" .split (//). Last (7) .join.to_s
Hard-Boiled Wonderland
@ Hard-BoiledWonderland joinfunktioniert. Ich glaube nicht, dass Sie den letzten brauchen, to_swenn Sie join verwenden.
Andrew Grimm
@AndrewGrimm Sie haben Recht, für diesen Fall habe ich das obige mit Nokogiri verwendet. n.xpath('ReferenceID').inner_text.split(//).last(7).join.to_s.to_iIch brauchte die to_s, um das to_i auszuführen, um den numerischen Wert zu extrahieren.
Hart gekochtes Wunderland
Sie vermissen .join - jetzt wird ein Array von Zeichenfolgen zurückgegeben. Stattdessen sollte es sein "123".split(//).last(5).join(Ruby 2.0.0)
Pavel Nikolov
115

Die einfachste Problemumgehung, die ich mir vorstellen kann, ist:

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

(BEARBEITEN: Der orOperator hat eine niedrigere Priorität als die Zuweisung. Verwenden Sie ihn ||stattdessen.)

Perimosocordiae
quelle
+1 ... Ich denke, dieser Weg ist leichter zu lesen als string.reverse[0..n].reverse, was mir eine Sekunde Zeit gibt: "Warte, warum macht er das?" (oder würde, wenn ich es nicht im Zusammenhang mit dieser Frage lesen würde)
Arkaaito
4
Gute Antwort, aber es sollte ||statt sein oroder Klammern setzen str[-n..-1] or str.
Andrew Grimm
Gute Antwort, aber ich mag es nicht, dass Ruby s [-inf ..- 1] nicht wie x [0..inf] behandelt
klochner
Vielen Dank, dass Sie das Problem mit der Priorität des Bedieners bemerkt haben, Andrew. Erwischt mich jedes Mal.
Perimosocordiae
@perimosocordiae du bist nicht der einzige. stackoverflow.com/questions/372652/…
Andrew Grimm
51

In Straight Ruby (ohne Rails) können Sie dies tun

string.chars.last(n).join

Beispielsweise:

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"

Wenn Sie Ruby on Rails verwenden, können Sie Methoden firstund lastein Zeichenfolgenobjekt aufrufen . Diese Methoden werden bevorzugt, da sie kurz und intuitiv sind.

Beispielsweise:

[1] pry(main)> a = 'abcdefg'                                                                                                                
 => "abcdefg"
[2] pry(main)> a.first(3)                                                                                                                   
 => "abc"
[3] pry(main)> a.last(4)                                                                                                                    
 => "defg"
Zack Xu
quelle
1
Ruby impliziert keine Rails.
Volte
14
ending = string.reverse[0...n].reverse
Andrew Grimm
quelle
Dies ist der beste Ansatz, den ich auf dieser Seite sehe und der die Anforderung erfüllt, eine Endzeichenlänge angeben zu können, die die Gesamtlänge der Zeichenfolge überschreitet.
Rob.Kachmar
1
Wenn Sie beispielsweise beabsichtigen, die letzten drei Zeichen einer Gruppe von Stichen wie "abcde", "ab" und "a" zu verwenden. Diese Technik führt dazu, dass "cde", "ab" und "a" jeweils denselben Code verwenden. "abcde".reverse[0,3].reverse>>> "cde" "ab".reverse[0,3].reverse>>> "ab" "a".reverse[0,3].reverse>>> "a"
Rob.Kachmar
9

Sie können den folgenden Code verwenden:

string[string.length-n,string.length]
rurkss
quelle
1
Nur Code - Antworten sind nicht immer hilfreich. zu erklären, warum / wie dieser Code das
Update
6

Um die letzten n Zeichen aus einer Zeichenfolge zu erhalten, können Sie dies tun

a [-n, n] wenn a das Array ist.

Hier ist ein Beispiel, wenn Sie eines möchten.

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
quelle
Wenn die Anzahl zu groß ist, nilwird zurückgegeben, was diese Frage speziell zu vermeiden versuchte.
Andrew Grimm
Gute Antwort. Reinigen.
Volte
Warum bekommt das positive Stimmen? Es hat genau das gleiche Problem wie das, was das OP zu beheben fragte.
Jeffdill2
5

Haben Sie eine Regex ausprobiert?

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

Der reguläre Ausdruck erfasst so viele Zeichen wie möglich am Ende der Zeichenfolge, jedoch nicht mehr als n. Und speichert es in 1 $.

EmFi
quelle
1

Verbesserung der Antwort von EmFi.

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