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

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

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


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

1
Ruby impliziert keine Rails.
Volte

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

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]

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


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


1

Verbesserung der Antwort von EmFi.

string[/.{,#{n}}\z/m]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.