So erhalten Sie die letzten Zeichen in einem String in Java, unabhängig von der Stringgröße


80

Ich suche nach einer Möglichkeit, die letzten Zeichen aus einem String zu ziehen, unabhängig von der Größe. Nehmen wir diese Zeichenfolgen als Beispiel:

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

Wie Sie sehen können, völlig zufällige Zeichenfolgen, aber sie haben 7 Zahlen am Ende. Wie könnte ich diese 7 Zahlen nehmen?

Bearbeiten:

Ich habe gerade festgestellt, dass String[] string = s.split(": ");das hier großartig funktionieren würde, solange ich String [2] für die Zahlen und String [1] für irgendetwas in der Mitte nenne.


Sowohl Ihre Frage als auch mehrere Antworten werden erwähnt String.split(), aber es ist erwähnenswert, dass jedes Mal, wenn Sie sie aufrufen s.split(": "), eine neue kompiliert java.uitl.regex.Patternwird. Ordnen Sie dann Ihre Zeichenfolge diesem Muster zu, und erstellen Sie eine Regex Matcherund eine ArrayListvor der String[]Rückgabe. Es wird relativ langsam sein und weit mehr als nötig zur Lösung dieses Problems bereitstellen. Ob dies wichtig ist, hängt von der Art Ihrer Bewerbung ab. Ich vermeide split()es im Allgemeinen, es sei denn, ich brauche es wirklich. (Beachten Sie, dass split()sich nicht regex verwenden , wenn Sie auf ein einzelnes Zeichen aufgeteilt.)
rjb1290

Antworten:


103

Viele Dinge, die Sie tun könnten.

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

wird alles nach dem letzten Doppelpunkt bekommen.

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

alles nach dem letzten Leerzeichen.

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

spaltet alle Ziffernfolgen ab; Das letzte Element des Zahlenarrays ist wahrscheinlich das, was Sie wollen.


4
Ein serendipitous Aspekt des lastIndexOfAnsatzes ist , dass , wenn es nicht alle Leerzeichen, lastIndexOfwird -1 zurück, so dass Sie mit dem ganzen String am Ende dann ( s.substring(0)).
Jon Skeet

s.substring (s.lastIndexOf (':') + 1); Ich würde das gerne verwenden, aber wie könnte ich die Buchstaben nach dem ersten Doppelpunkt erhalten? Wäre es nicht an indexOf (":", 1)?
PuppyKevin

144

Wie wäre es mit:

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

Das setzt voraus , dass es sind 7 Zeichen am Ende, natürlich. Es wird eine Ausnahme ausgelöst, wenn Sie "12345" übergeben. Sie könnten das folgendermaßen ansprechen:

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

oder

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

Beachten Sie, dass dies immer noch keine Überprüfung durchführt, ob die resultierende Zeichenfolge Zahlen enthält - und es wird immer noch eine Ausnahme textauslösen, wenn sie null ist.


54

Diese Frage ist das beste Google-Ergebnis für "Java String Right".

Überraschenderweise hat noch niemand Apache Commons StringUtils.right () erwähnt :

String numbers = org.apache.commons.lang.StringUtils.right( text, 7 );

Dies behandelt auch den Fall, in dem textnull ist und viele der anderen Antworten eine NullPointerException auslösen würden.


1
Ich frage mich auch. Dieser Weg ist viel sicherer als die Behandlung aller möglichen Probleme.
Jaroslav Kuboš

Dies ist auch die einzige Antwort, die funktioniert, wenn Sie einen einzelnen Ausdruck benötigen, um etwas sicher in eine Zeichenfolge zu konvertieren und bis zu den letzten nZeichen zu gelangen. Zum Beispiel könnten Sie tun StringUtils.right(Objects.toString(someObj), 7).
rjb1290

23

Dieser Code funktioniert perfekt für mich:

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

7

Sie können dies mit diesem einzeiligen Code erreichen:

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

Achten Sie jedoch darauf, Exception abzufangen, wenn die Länge der Eingabezeichenfolge weniger als 7 beträgt .

Sie können 7 durch eine beliebige Zahl ersetzen, z. B. N, wenn Sie die letzten 'N'-Zeichen erhalten möchten.


1
Es ist besser, im Voraus zu prüfen, ob die Eingabelänge 7 oder länger ist, und dann die Teilzeichenfolge auszuführen.
Orique

4

Ich würde entweder String.splitoder einen regulären Ausdruck verwenden:


Verwenden von String.split

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

Verwenden von RegEx (erforderlich import java.util.regex.*)

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

2
Regex sollte [0-9]{7}$sicherstellen, dass es mit den letzten 7 Ziffern übereinstimmt .
Whiskysierra

@ Willi Schönborn: Einverstanden. Der Fall des OP deutete darauf hin, dass die anderen Gruppen in der Zeichenfolge immer Buchstaben enthalten würden. Ich ging davon aus, dass es nicht notwendig war, eine Grenze anzugeben.
FK82

2
String inputstr = "abcd: efg: 1006746"
int startindex = inputstr.length() - 10;
String outputtendigitstr = inputstr.substring(startindex);

Stellen Sie sicher, dass die Zeichenfolgenlänge mehr als 10 beträgt.


1

Das sollte funktionieren

 Integer i= Integer.parseInt(text.substring(text.length() - 7));

1

StringUtils.substringAfterLast ("abcd: efg: 1006746", ":") = "1006746";

Solange das Format der Zeichenfolge festgelegt ist, können Sie substringAfterLast verwenden .



0

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

-Schritt 1: String firstString = "abcd: efg: 1006746";

-Schritt 2: String lastSevenNumber = firstString.substring(firstString.lastIndexOf(':'), firstString.length()).trim();

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.