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

198

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

/abc/def/ghfj.doc

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

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

Солнечно
источник
40
Послушайте, я понимаю ценность поиска ответа перед тем, как задавать вопросы, но в том-то и дело, что этот вопрос значительно облегчил мой поиск ... именно то, что я хотел после первого попадания. Быстрее, чем консалтинг Javadocs. Хорошо, что этот вопрос здесь. Почему отрицательные?
Эрик
3
Хотя это несколько отличается от вашего первоначального вопроса: в вашем примере org.apache.commons.io.FilenameUtils.getBaseName гораздо надежнее, чем выполнение ваших собственных строковых операций.
До Schäfer
4
@Eric Я полностью согласен с вашим комментарием, так как это был первый результат Google по моему вопросу, и принятый ответ - именно то, что мне нужно было использовать.
Тоннор

Ответы:

314
    String example = "/abc/def/ghfj.doc";
    System.out.println(example.substring(example.lastIndexOf("/") + 1));
Себастьян Ле Каллоннек
источник
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];
Veger
источник
1
этот код будет выдавать ошибку Array Index Out of Bounds, если разделитель не найден.
Патрик Паркер
36

что ты пробовал? это очень просто:

String s = "/abc/def/ghfj.doc";
s.substring(s.lastIndexOf("/") + 1)
vishal_aim
источник
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

Пушья
источник
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"
user6317575
источник
этот код выдаст ошибку, если разделитель не найден.
Патрик Паркер
@PatrickParker Почему вы везде прокомментировали, что он выдаст ошибку, если разделитель не найден. Если вы делаете это в целях знания, чем все в порядке, но я просто думаю, что это может быть слишком много ...
Gaurav Mall
@GauravMall Я помогаю людям улучшить свои ответы, писать более качественный код и тем, кто посещает, помочь им избежать ловушек и улучшить понимание кода, прежде чем он вставит его куда-нибудь. Я с удовольствием удалю свой комментарий, как только ответ улучшится. Кроме того, писать это в двух местах вряд ли "везде". Наконец, раздел комментариев не предназначен для мета-обсуждения.
Патрик Паркер