117 votes

Extraction des n derniers caractères d'une chaîne ruby

Pour obtenir le dernier n d'une chaîne de caractères, j'ai supposé que vous pouviez utiliser

ending = string[-n..-1]

mais si la chaîne est inférieure à n lettres longues, vous obtenez nil .

Quelles sont les solutions de contournement disponibles ?

Contexte : Les chaînes sont en ASCII pur, j'ai accès à ruby 1.9.1, et j'utilise Plain Old Ruby Objects (pas de frameworks web).

122voto

perimosocordiae Points 4582

Eh bien, la solution la plus simple à laquelle je pense est :

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

(EDIT : Le or a une priorité inférieure à celle de l'assignation, donc assurez-vous d'utiliser || à la place).

0 votes

+1... Je pense que cette façon est plus facile à lire que string.reverse[0..n].reverse ce qui me donne une seconde de "attends, pourquoi fait-il ça ?". (ou le ferait si je ne le lisais pas dans le contexte de cette question).

4 votes

Bonne réponse, mais ça devrait être || au lieu de or ou mettre des parenthèses autour de str[-n..-1] or str .

0 votes

Bonne réponse, mais je n'aime pas que ruby ne traite pas s[-inf..-1] de la même façon que x[0..inf].

111voto

Gareve Points 1251

Ici vous avez un one liner, vous pouvez mettre un nombre plus grand que la taille de la chaîne :

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

Pour ruby 1.9+

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

Pour ruby 2.0+, join renvoie une chaîne de caractères

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

23 votes

Si vous utilisez une version récente de Ruby, vous pouvez utiliser chars au lieu de diviser.

1 votes

J'ai utilisé "12345678910".split(//).last(7).join.to_s

0 votes

@Hard-BoiledWonderland join fonctionne. Je ne pense pas que vous ayez besoin du dernier to_s si vous utilisez join.

14voto

Andrew Grimm Points 22996
ending = string.reverse[0...n].reverse

0 votes

C'est la meilleure approche que j'ai vue sur cette page qui répond à l'exigence de pouvoir fournir une longueur de caractère finale qui dépasse la longueur totale de la chaîne.

1 votes

Par exemple, si vous avez l'intention de prendre les 3 derniers caractères d'un groupe de stings comme "abcde", "ab" et "a". Cette technique permettra d'obtenir "cde", "ab" et "a" en utilisant le même code pour chacun. "abcde".reverse[0,3].reverse >>> "cde" "ab".reverse[0,3].reverse >>> "ab" "a".reverse[0,3].reverse >>> "a"

6voto

Sunil Points 443

Pour obtenir les n derniers caractères d'une chaîne de caractères, vous pouvez faire ceci

a[-n, n] si a est le tableau.

Voici un exemple si vous en voulez un.

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

\=> "9

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

\=> "67890"

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

\=> "4567890"

0 votes

Si le nombre est trop important, nil est renvoyée, ce que cette question cherchait précisément à éviter.

0 votes

Bonne réponse. Propre.

0 votes

Pourquoi est-ce que ça reçoit des votes positifs ? C'est exactement le même problème que celui que le PO voulait résoudre.

5voto

EmFi Points 18645

Avez-vous essayé une regex ?

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

La regex capture autant de caractères qu'elle peut à la fin de la chaîne, mais pas plus que n. Et la stocke dans $1.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X