Java: Obtendo uma substring a partir de uma sequência iniciando após um caractere específico

196

Eu tenho uma string:

/abc/def/ghfj.doc

Eu gostaria de extrair ghfj.docdisso, ou seja, a substring após o último /ou primeiro /da direita.

Alguém poderia, por favor, fornecer alguma ajuda?

Ensolarado
fonte
39
olha, eu entendo o valor de procurar a resposta antes de fazer perguntas, mas o fato é que essa pergunta tornou minha pesquisa muito mais fácil .. exatamente o que eu queria após o primeiro hit. Mais rápido que consultar javadocs. É bom que esta pergunta esteja aqui. Por que os votos negativos?
Eric
3
Embora isso seja um pouco diferente da sua pergunta original: No seu exemplo, org.apache.commons.io.FilenameUtils.getBaseName é muito mais confiável do que executar suas próprias operações de string.
Till Schäfer
4
@ Eric Estou totalmente de acordo com o seu comentário, pois este foi o primeiro resultado do Google para a minha pergunta e a resposta aceita é exatamente o que eu precisava usar.
thonnor

Respostas:

310
    String example = "/abc/def/ghfj.doc";
    System.out.println(example.substring(example.lastIndexOf("/") + 1));
Sébastien Le Callonnec
fonte
42

Uma implementação muito simples com 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
fonte
1
esse código lançará um erro de índice fora dos limites da matriz se o separador não for encontrado.
Patrick Parker
36

o que você tentou? é muito simples:

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

Outra maneira é usar isso .

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

Se você passar nulo para esse método, ele retornará nulo. Se não houver correspondência com o separador, ele retornará uma string vazia.

Alex Green
fonte
1
Finalmente, algo realmente útil, não sabia sobre esse método. Eu odeio ter problemas com substring + indexof + 1 - 2 +3 qualquer. Este é muito mais limpo :)
BAERUS
Se você deseja usar esse método no Android, você deve importar a StringUtilsbiblioteca, esta resposta mostra a necessidade de fazê-lo: stackoverflow.com/a/33935645/2966583
stramin
9

Você pode usar o Apache commons:

Para substring após a última ocorrência, use este método.

E para substring após a primeira ocorrência, o método equivalente está aqui .

Michal Przysucha
fonte
4

Isso também pode obter o nome do arquivo

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

Vai imprimir ghfj.doc

pushya
fonte
1

No Kotlin você pode usar substringAfterLast, especificando um delimitador.

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

Do documento :

Retorna uma substring após a última ocorrência do delimitador. Se a sequência não contiver o delimitador, retornará missingDelimiterValue, cujo padrão é a sequência original.

Filipe Brito
fonte
0

Eu acho que seria melhor se usarmos diretamente a função split

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

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

String returnValue = result[result.length - 1]; //equals "ghfj.doc"
user6317575
fonte
esse código gerará um erro se o separador não for encontrado.
Patrick Parker
@PatrickParker Por que você comentou em todos os lugares que isso gerará um erro se o separador não for encontrado. Se você está fazendo isso para fins de conhecimento do que bem, mas eu só acho que é um pouco demais, talvez ...
Gaurav Shopping
@GauravMall Ajudo as pessoas a melhorar suas respostas, a escrever um código melhor e, para quem está visitando, ajudá-las a evitar armadilhas e desenvolver o entendimento do código antes de colá-lo em algum lugar. Terei o prazer de remover meu comentário assim que a resposta for melhorada. Além disso, escrevê-lo em dois lugares dificilmente está "em todo lugar". Finalmente, a seção de comentários não é para meta-discussão.
Patrick Parker