90 votes

Comment obtenir les derniers caractères d'une chaîne de caractères en Java, quelle que soit la taille de celle-ci ?

Je cherche un moyen d'extraire les derniers caractères d'une chaîne, quelle que soit sa taille. Prenons ces chaînes en exemple :

"abcd: efg: 1006746"
"bhddy: nshhf36: 1006754"
"hfquv: nd: 5894254"

Comme vous pouvez le voir, des chaînes complètement aléatoires, mais elles ont 7 numéros à la fin. Comment pourrais-je prendre ces 7 numéros ?

Edit :

Je viens de réaliser que String[] string = s.split(": "); fonctionnerait parfaitement ici, tant que j'appelle string[2] pour les chiffres et string[1] pour tout ce qui se trouve au milieu.

0 votes

Votre question et plusieurs réponses mentionnent String.split() mais il est intéressant de noter que s.split(": ") va compiler un nouveau java.uitl.regex.Pattern à chaque fois que vous l'appelez, puis fait correspondre votre chaîne avec ce motif, créant ainsi une regex Matcher et un ArrayList avant le String[] qui est retourné. Il sera relativement lent et allouera bien plus que nécessaire pour résoudre ce problème. L'importance de ce problème dépend de la nature de votre application. J'évite généralement split() sauf si j'en ai vraiment besoin. (Notez que split() fait pas utilisez une regex si vous divisez sur un seul caractère).

156voto

Jon Skeet Points 692016

Pourquoi pas :

String numbers = text.substring(text.length() - 7);

Cela suppose qu'il y a sont 7 caractères à la fin, bien sûr. Une exception sera levée si vous lui passez "12345". Vous pouvez résoudre ce problème de cette façon :

String numbers = text.substring(Math.max(0, text.length() - 7));

ou

String numbers = text.length() <= 7 ? text : text.substring(text.length() - 7);

Notez que cette méthode ne permet toujours pas de vérifier que la chaîne de caractères résultante contient des nombres, et qu'elle lèvera toujours une exception si la chaîne de caractères résultante contient des nombres. text est nulle.

109voto

Chris Dodd Points 39013

Il y a beaucoup de choses que vous pourriez faire.

s.substring(s.lastIndexOf(':') + 1);

récupérera tout ce qui se trouve après le dernier point.

s.substring(s.lastIndexOf(' ') + 1);

tout ce qui se trouve après le dernier espace.

String numbers[] = s.split("[^0-9]+");

sépare toutes les séquences de chiffres ; le dernier élément du tableau de chiffres est probablement ce que vous voulez.

5 votes

Un aspect fortuit de la lastIndexOf L'approche est la suivante : s'il y a ne sont pas tout espace, lastIndexOf retournera -1, donc vous vous retrouverez avec la chaîne entière ( s.substring(0) ).

0 votes

s.substring(s.lastIndexOf(':') + 1) ; J'aimerais utiliser cela, mais comment pourrais-je obtenir les lettres après le premier point ? Ne serait-ce pas s.indexOf(" :", 1) ?

23voto

Shehbaz Khan Points 539

Ce code fonctionne parfaitement pour moi :

String numbers = text.substring(Math.max(0, text.length() - 7));

7voto

Sumanth.B.C Points 21

Vous pouvez le faire en utilisant cette seule ligne code :

String numbers = text.substring(text.length() - 7, text.length());

Mais assurez-vous de catch Exception si la longueur de la chaîne d'entrée est inférieure à 7 .

Vous pouvez remplacer 7 par un nombre quelconque, par exemple N, si vous voulez obtenir les 'N' derniers caractères.

1 votes

Il est préférable de vérifier à l'avance si la longueur de l'entrée est égale ou supérieure à 7, puis d'effectuer la sous-chaîne.

4voto

FK82 Points 1464

J'utiliserais soit String.split ou une regex :


Utilisation de String.split

String[] numberSplit = yourString.split(":") ; 
String numbers = numberSplit[ (numberSplit.length-1) ] ; //!! last array element

Utilisation de RegEx (nécessite import java.util.regex.* )

String numbers = "" ;
Matcher numberMatcher = Pattern.compile("[0-9]{7}").matcher(yourString) ;
    if( matcher.find() ) {
            numbers = matcher.group(0) ;
    }

2 votes

La Regex devrait être [0-9]{7}$ pour s'assurer qu'il correspond au dernier 7 chiffres.

0 votes

Willi Schönborn : Je suis d'accord. Le cas de l'OP suggérait que les autres groupes de la chaîne contiendraient toujours des lettres. Je supposais qu'il n'était pas nécessaire de spécifier une limite.

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