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.

PuppyKevin
quelle
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.

Chris Dodd
quelle
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.

Jon Skeet
quelle
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.

Richard Inglis
quelle
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));
Shehbaz Khan
quelle
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.

Sumanth
quelle
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) ;
    } 
FK82
quelle
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.

user2902302
quelle
1

Das sollte funktionieren

 Integer i= Integer.parseInt(text.substring(text.length() - 7));
Prasoon Saurav
quelle
1

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

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

Agyeya Gupta
quelle
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();

Ronak Patel
quelle