Как получить последние символы в строке в Java, независимо от размера строки

80

Я ищу способ вытащить последние символы из строки независимо от размера. Давайте рассмотрим эти строки в качестве примера:

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

Как видите, совершенно случайные строки, но в конце у них есть 7 чисел. Как я смогу взять эти 7 чисел?

Редактировать:

Я только что понял, String[] string = s.split(": ");что здесь это будет отлично работать, если я буду вызывать строку [2] для чисел и строку [1] для чего-нибудь посередине.

ЩенокКевин
источник
Упоминаются как ваш вопрос, так и несколько ответов String.split(), но стоит отметить, что s.split(": ")он будет компилировать новый java.uitl.regex.Patternкаждый раз, когда вы его вызываете, а затем сопоставляет свою строку с этим шаблоном, создавая регулярное выражение Matcherи ArrayListперед тем String[], как оно будет возвращено. Это будет относительно медленно, и на решение этой проблемы будет выделено гораздо больше, чем необходимо. Будет ли это иметь значение, зависит от характера вашего приложения. Я обычно избегаю, split()если мне это действительно не нужно. (Обратите внимание , что split()это не использовать регулярное выражение , если вы разделите на один символ.)
rjb1290

Ответы:

104

Вы могли бы многое сделать.

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

получит все после последнего двоеточия.

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

все после последнего пробела.

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

разбивает все последовательности цифр; последний элемент массива чисел - это, вероятно, то, что вам нужно.

Крис Додд
источник
4
Одним из аспектов счастливой случайностью на lastIndexOfподхода заключается в том, что если не все пробелы, lastIndexOfвернет -1, так что вы будете в конечном итоге с целой строки ( s.substring(0)).
Джон Скит,
s.substring (s.lastIndexOf (':') + 1); Я хотел бы использовать это, но как я смогу получить буквы после первого двоеточия? Разве это не было бы s.indexOf (":", 1)?
PuppyKevin
144

Как насчет:

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

Это предполагает , что есть 7 символов в конце, конечно. Это вызовет исключение, если вы передадите ему «12345». Вы можете решить это так:

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

или же

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

Обратите внимание, что это все еще не проверяет, содержит ли результирующая строка числа - и оно все равно вызовет исключение, если оно textравно нулю.

Джон Скит
источник
54

Этот вопрос является лучшим результатом Google для "Java String Right".

Удивительно, но никто еще не упомянул Apache Commons StringUtils.right () :

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

Это также обрабатывает случай, когда значение textnull, когда многие другие ответы будут вызывать исключение NullPointerException.

Ричард Инглис
источник
1
Мне тоже интересно. Этот способ намного безопаснее, чем устранение всех возможных проблем.
Ярослав Кубош 03
Это также единственный ответ, который работает, если вам нужно / нужно одно выражение для безопасного преобразования чего-либо в строку и перехода к последним nсимволам. Например, вы могли бы это сделать StringUtils.right(Objects.toString(someObj), 7).
rjb1290
23

Этот код отлично работает у меня:

String numbers = text.substring(Math.max(0, text.length() - 7));
Шехбаз Хан
источник
7

Вы можете добиться этого, используя этот однострочный код:

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

Но не забудьте поймать Exception, если длина входной строки меньше 7 .

Вы можете заменить 7 любым числом, например N, если хотите получить последние N символов.

Сумант
источник
1
Лучше заранее проверить, равна ли входная длина 7 или больше, а затем сделать подстроку.
orique
4

Я бы использовал либо String.splitрегулярное выражение, либо:


Использование String.split

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

Использование RegEx (требуется import java.util.regex.*)

String numbers = "" ;
Matcher numberMatcher = Pattern.compile("[0-9]{7}").matcher(yourString) ;
    if( matcher.find() ) {
            numbers = matcher.group(0) ;
    } 
FK82
источник
2
Регулярное выражение должно быть [0-9]{7}$таким, чтобы оно соответствовало последним 7 цифрам.
Whkeysierra,
@ Вилли Шенборн: Согласен. Случай OP предполагает, что другие группы в строке всегда будут содержать буквы. Я предполагал, что указывать границу не нужно.
FK82
2
String inputstr = "abcd: efg: 1006746"
int startindex = inputstr.length() - 10;
String outputtendigitstr = inputstr.substring(startindex);

Убедитесь, что длина строки больше 10.

user2902302
источник
1

Это должно работать

 Integer i= Integer.parseInt(text.substring(text.length() - 7));
Prasoon Saurav
источник
1

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

Пока формат строки фиксирован, вы можете использовать substringAfterLast .

Агьея Гупта
источник
0

Например: «abcd: efg: 1006746» «bhddy: nshhf36: 1006754» «hfquv: nd: 5894254»

-Шаг 1: String firstString = "abcd: efg: 1006746";

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

Ронак Патель
источник