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


198

У меня есть строка:

/abc/def/ghfj.doc

Я хотел бы извлечь ghfj.docиз этого, то есть подстроку после последней /или первой /справа.

Может ли кто-нибудь помочь?


40
Послушайте, я понимаю ценность поиска ответа перед тем, как задавать вопросы, но в том-то и дело, что этот вопрос значительно облегчил мой поиск ... именно то, что я хотел после первого попадания. Быстрее, чем консалтинг Javadocs. Хорошо, что этот вопрос здесь. Почему отрицательные?
Эрик

3
Хотя это несколько отличается от вашего первоначального вопроса: в вашем примере org.apache.commons.io.FilenameUtils.getBaseName гораздо надежнее, чем выполнение ваших собственных строковых операций.
До 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
этот код будет выдавать ошибку Array Index Out of Bounds, если разделитель не найден.
Патрик Паркер

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
страмин

9

Вы можете использовать Apache Commons:

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

А для подстроки после первого появления эквивалентный метод здесь .


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


2

С Guava сделать это:

String id="/abc/def/ghfj.doc";
String valIfSplitIsEmpty="";
return Iterables.getLast(Splitter.on("/").split(id),valIfSplitIsEmpty);

В конечном итоге настроить Splitterи использовать

Splitter.on("/")
.trimResults()
.omitEmptyStrings()
...

Также ознакомьтесь с этой статьей о разделителе гуавы и этой статье об итерациях гуавы.


1

В Kotlin вы можете использовать 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.