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.