Jak uzyskać ostatnie znaki w ciągu w Javie, niezależnie od rozmiaru ciągu

80

Szukam sposobu na wyciągnięcie ostatnich znaków ze String, niezależnie od rozmiaru. Weźmy te ciągi na przykład:

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

Jak widać, całkowicie losowe ciągi, ale mają na końcu 7 liczb. Jak mógłbym wziąć te 7 liczb?

Edytować:

Właśnie zdałem sobie sprawę, że String[] string = s.split(": ");będzie świetnie tutaj działać, pod warunkiem, że wywołam string [2] dla liczb i string [1] dla czegokolwiek pośrodku.

PuppyKevin
źródło
Zarówno twoje pytanie, jak i kilka odpowiedzi wspominają String.split(), ale warto zauważyć, że s.split(": ")za java.uitl.regex.Patternkażdym razem, gdy je wywołasz, skompiluje się nowy , a następnie dopasuje twój ciąg do tego wzorca, tworząc regex Matcheri ArrayListprzed String[]zwróceniem tego. Będzie on stosunkowo powolny i przydzieli znacznie więcej niż to konieczne, aby rozwiązać ten problem. To, czy ma to znaczenie, zależy od charakteru Twojej aplikacji. Generalnie unikam, split()chyba że naprawdę tego potrzebuję. (Należy pamiętać, że split()nie nie użyć wyrażenia regularnego, jeśli podzielić na jednym znaku.)
rjb1290

Odpowiedzi:

104

Wiele rzeczy możesz zrobić.

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

otrzyma wszystko po ostatniej okrężnicy.

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

wszystko po ostatniej spacji.

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

oddziela wszystkie ciągi cyfr; ostatni element tablicy liczb jest prawdopodobnie tym, czego potrzebujesz.

Chris Dodd
źródło
4
Jednym z nieoczekiwanych aspektów tego lastIndexOfpodejścia jest to, że jeśli nie ma żadnych spacji, lastIndexOfzwróci -1, więc otrzymasz cały ciąg ( s.substring(0)).
Jon Skeet,
s.substring (s.lastIndexOf (':') + 1); Chciałbym tego użyć, ale jak mógłbym uzyskać litery po pierwszym dwukropku? Czy nie byłby to s.indexOf (":", 1)?
PuppyKevin
144

Co powiesz na:

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

Zakłada to oczywiście, że na końcu jest 7 postaci. Jeśli przekażesz mu „12345”, zgłosi wyjątek. Możesz rozwiązać ten problem w ten sposób:

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

lub

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

Zwróć uwagę, że to nadal nie sprawdza, czy otrzymany ciąg zawiera liczby - i nadal będzie zgłaszać wyjątek, jeśli textma wartość null.

Jon Skeet
źródło
54

To pytanie jest najlepszym wynikiem Google dla „Java String Right”.

O dziwo, nikt jeszcze nie wspomniał o Apache Commons StringUtils.right () :

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

Obsługuje to również przypadek, w którym textjest null, w którym wiele innych odpowiedzi zgłosiło wyjątek NullPointerException.

Richard Inglis
źródło
1
Ja też się zastanawiam. Ten sposób jest znacznie bezpieczniejszy niż rozwiązywanie wszystkich możliwych problemów.
Jaroslav Kuboš
Jest to również jedyna odpowiedź, która działa, jeśli chcesz / potrzebujesz pojedynczego wyrażenia, aby bezpiecznie przekonwertować coś na ciąg i uzyskać do ostatnich nznaków. Na przykład możesz to zrobić StringUtils.right(Objects.toString(someObj), 7).
rjb1290
23

Ten kod działa dla mnie idealnie:

String numbers = text.substring(Math.max(0, text.length() - 7));
Shehbaz Khan
źródło
7

Możesz to osiągnąć za pomocą tego jednowierszowego kodu:

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

Ale pamiętaj, aby złapać wyjątek, jeśli długość ciągu wejściowego jest mniejsza niż 7 .

Możesz zamienić 7 na dowolną liczbę, powiedz N, jeśli chcesz uzyskać ostatnie „N” znaków.

Sumanth
źródło
1
Lepiej jest wcześniej sprawdzić, czy długość wejściowa wynosi 7 lub więcej, a następnie wykonać podciąg.
orique
4

Użyłbym albo String.splitalbo wyrażenia regularnego:


Korzystanie z String.split

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

Korzystanie z wyrażenia regularnego (wymaga import java.util.regex.*)

String numbers = "" ;
Matcher numberMatcher = Pattern.compile("[0-9]{7}").matcher(yourString) ;
    if( matcher.find() ) {
            numbers = matcher.group(0) ;
    } 
FK82
źródło
2
Regex powinien mieć [0-9]{7}$pewność, że pasuje do ostatnich 7 cyfr.
whiskeysierra
@ Willi Schönborn: Zgoda. Przypadek OP sugerował, że inne grupy w łańcuchu zawsze będą zawierały litery. Założyłem, że określenie granicy nie jest konieczne.
FK82
2
String inputstr = "abcd: efg: 1006746"
int startindex = inputstr.length() - 10;
String outputtendigitstr = inputstr.substring(startindex);

Upewnij się, że długość sznurka jest większa niż 10.

user2902302
źródło
1

To powinno działać

 Integer i= Integer.parseInt(text.substring(text.length() - 7));
Prasoon Saurav
źródło
1

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

Dopóki format ciągu jest ustalony, możesz użyć substringAfterLast .

Agyeya Gupta
źródło
0

Np .: „abcd: efg: 1006746” „bhddy: nshhf36: 1006754” „hfquv: nd: 5894254”

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

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

Ronak Patel
źródło