Estrazione degli ultimi n caratteri da una stringa Ruby


105

Per ottenere gli ultimi ncaratteri da una stringa, ho pensato che potessi usare

ending = string[-n..-1]

ma se la stringa è nlunga meno di lettere, ottieni nil.

Quali soluzioni sono disponibili?

Background : le stringhe sono semplici ASCII e ho accesso a ruby ​​1.9.1 e sto usando Plain Old Ruby Objects (nessun framework web).

Risposte:


99

Qui hai una riga, puoi inserire un numero maggiore della dimensione della stringa:

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

Per rubino 1.9+

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

Per ruby ​​2.0+, join restituisce una stringa

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

19
Se stai usando una versione recente di Ruby, potresti usare charsinvece di split.
— Andrew Grimm

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

@ Hard-BoiledWonderland joinfunziona. Non penso che tu abbia bisogno dell'ultimo to_sse usi join.
— Andrew Grimm

@AndrewGrimm Hai ragione, per quel caso ho usato quanto sopra con Nokogiri, n.xpath('ReferenceID').inner_text.split(//).last(7).join.to_s.to_iavevo bisogno di to_s per eseguire to_i per estrarre il valore numerico.
— Hard-Boiled Wonderland

Ti manca .join - ora restituisce un array di stringhe. Invece dovrebbe essere "123".split(//).last(5).join(Ruby 2.0.0)
— Pavel Nikolov

115

Bene, la soluzione più semplice a cui riesco a pensare è:

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

(EDIT: l' oroperatore ha una precedenza inferiore rispetto all'assegnazione, quindi assicurati di usarlo ||.)


+1 ... Penso che in questo modo sia più facile da leggere che string.reverse[0..n].reverse, il che mi dà un secondo di "aspetta, perché lo fa?" (o lo farei se non lo
— leggessi

4
Buona risposta, ma dovrebbe essere al ||posto di or, o racchiudere tra parentesi str[-n..-1] or str.
— Andrew Grimm

Buona risposta, ma non mi piace che il rubino non tratti s [-inf ..- 1] come x [0..inf]
— klochner

Grazie per aver notato il problema della precedenza degli operatori, Andrew. Mi prende ogni volta.
— perimosocordiae

@perimosocordiae non sei l'unico. stackoverflow.com/questions/372652/…
— Andrew Grimm

51

In Ruby dritto (senza Rails), puoi farlo

string.chars.last(n).join

Per esempio:

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"

Se stai usando Ruby on Rails, puoi chiamare metodi firste lastsu un oggetto stringa. Questi metodi sono preferiti in quanto sono succinti e intuitivi.

Per esempio:

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

1
Ruby non implica Rails.
— Volte

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

Questo è l'approccio migliore che vedo in questa pagina che soddisfa il requisito di essere in grado di fornire una lunghezza di carattere finale che superi la lunghezza totale della stringa.
— Rob.Kachmar

1
Ad esempio, se intendi prendere gli ultimi 3 caratteri di un gruppo di punture come "abcde", "ab" e "a". Questa tecnica farà sì che "cde", "ab" e "a" utilizzino lo stesso codice per ciascuno. "abcde".reverse[0,3].reverse>>> "cde" "ab".reverse[0,3].reverse>>> "ab" "a".reverse[0,3].reverse>>> "a"
— Rob.Kachmar

9

Puoi usare il codice seguente:

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

1
solo codice: le risposte non sono sempre utili. spiegare perché / come questo codice è la correzione sarebbe fantastico
— ry8806

6

Per ottenere gli ultimi n caratteri da una stringa, puoi farlo

a [-n, n] se a è l'array.

Ecco un esempio se ne desideri uno.

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

=> "911234567890"

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

=> "67890"

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

=> "4567890"


Se il numero è troppo grande, nilviene restituito, che è ciò che questa domanda stava specificamente cercando di evitare.
— Andrew Grimm

Buona risposta. Pulito.
— Volte

Perché questo sta ottenendo voti positivi? Ha lo stesso identico problema di quello che l'OP stava chiedendo come risolvere.
— jeffdill2

5

Hai provato una regex?

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

La regex cattura il maggior numero di caratteri possibile alla fine della stringa, ma non più di n. E lo memorizza in $ 1.


1

Miglioramento della risposta di EmFi.

string[/.{,#{n}}\z/m]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.