Java: отримання підрядки з рядка, що починається після певного символу


198

У мене є рядок:

/abc/def/ghfj.doc

Я хотів би витягнути ghfj.docз цього, тобто підрядку після останньої /, або першої /справа.

Може хтось, будь ласка, надати допомогу?


40
Подивіться, я розумію цінність пошуку відповіді самостійно перед тим, як задавати питання, але факт питання - це питання полегшило мій пошук .. саме те, що я хотів після першого влучення. Швидше, ніж консультації з javadocs. Добре, що це питання тут. Чому голоси?
Ерік

3
Хоча це дещо відрізняється від вашого початкового питання: У вашому прикладі org.apache.commons.io.FilenameUtils.getBaseName набагато надійніше, ніж робити власні рядкові операції.
Till Schäfer

4
@Eric Я повністю згоден з вашим коментарем, оскільки це був перший результат Google на моє запитання, і прийнята відповідь - саме те, що мені потрібно було використовувати.
Тоннор

Відповіді:



42

Дуже проста реалізація з String.split():

String path = "/abc/def/ghfj.doc";
// Split path into segments
String segments[] = path.split("/");
// Grab the last segment
String document = segments[segments.length - 1];

1
цей код видасть помилку індексу масиву поза межами, якщо роздільник не знайдений.
Патрік Паркер

36

що ви пробували? це дуже просто:

String s = "/abc/def/ghfj.doc";
s.substring(s.lastIndexOf("/") + 1)

24

Інший спосіб полягає у використанні цього .

String path = "/abc/def/ghfj.doc"
String fileName = StringUtils.substringAfterLast(path, "/");

Якщо ви передасте null цьому методу, він поверне null. Якщо немає відповідності з роздільником, він поверне порожній рядок.


1
Нарешті щось дійсно зручно, не знав про цей метод. Мені не хочеться турбуватися з підрядкою + indexof + 1 - 2 +3 хоч би що. Це набагато чистіше :)
BAERUS

Якщо ви хочете використовувати цей метод на Android, ви повинні імпортувати StringUtilsбібліотеку, ця відповідь показує гарячі зробити це: stackoverflow.com/a/33935645/2966583
stramin

9

Ви можете використовувати спільноти Apache:

Для підрядків після останнього появи використовуйте цей метод.

І подстроки після першої появи еквівалентного методу є тут .


4

Це також може отримати ім'я файлу

import java.nio.file.Paths;
import java.nio.file.Path;
Path path = Paths.get("/abc/def/ghfj.doc");
System.out.println(path.getFileName().toString());

Буде надруковано ghfj.doc



1

У Котліні ви можете використовувати substringAfterLast, вказавши роздільник.

val string = "/abc/def/ghfj.doc"
val result = url.substringAfterLast("/")
println(result)
// It will show ghfj.doc

Від док .

Повертає підрядку після останнього появи роздільника. Якщо рядок не містить роздільника, повертає missingDelimiterValue, який за замовчуванням до початкового рядка.


0

Я думаю, що було б краще, якщо ми будемо використовувати безпосередньо функцію спліт

String toSplit = "/abc/def/ghfj.doc";

String result[] = toSplit.split("/");

String returnValue = result[result.length - 1]; //equals "ghfj.doc"

цей код видасть помилку, якщо роздільник не знайдений.
Патрік Паркер

@PatrickParker Чому ви скрізь коментували, що це призведе до помилки, якщо роздільник не знайдеться. Якщо ви робите це з метою знань, ніж гаразд, але я просто думаю, що це трохи занадто, можливо ...
Gaurav Mall

@GauravMall Я допомагаю людям покращити свої відповіді, написати кращий код, а тим, хто відвідує, допомогти їм уникнути підводних каменів та створити розуміння коду, перш ніж десь вставити його. Я з радістю видаляю свій коментар, як тільки відповідь буде покращена. Також писати його в двох місцях навряд чи «скрізь». Нарешті, розділ коментарів не для мета-обговорення.
Патрік Паркер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.