Как получить последние символы в строке в 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


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) ;
    } 

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.



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();

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.