Як отримати останні символи в рядку в 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має значення null.


54

Це питання є найкращим результатом Google для "Java String Right".

Дивно, але про Apache Commons StringUtils.right () ще ніхто не згадував :

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

Це також обробляє випадок, коли textє null, де багато хто з інших відповідей викликає NullPointerException.


1
Мені теж цікаво. Цей спосіб набагато безпечніший, ніж вирішення всіх можливих проблем.
Ярослав Кубош

Це також єдина відповідь, яка працює, якщо вам потрібен / потрібен один вираз, щоб безпечно перетворити щось у рядок і отримати до останніх 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 цифрам.
whiskeysierra

@ Віллі Шенборн: Погоджено. Справа 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.