Java: pobieranie podłańcucha z ciągu rozpoczynającego się od określonego znaku

196

Mam ciąg:

/abc/def/ghfj.doc

Chciałbym ghfj.docz tego wyodrębnić , tzn. Podłańcuch po ostatnim /lub pierwszy /od prawej.

Czy ktoś mógłby udzielić pomocy?

Słoneczny
źródło
39
słuchaj, rozumiem wartość samodzielnego szukania odpowiedzi przed zadawaniem pytań, ale faktem jest, że to pytanie znacznie ułatwiło moje wyszukiwanie .. dokładnie to, czego chciałem po pierwszym trafieniu. Szybsze niż konsultacje z javadocs. Dobrze, że to pytanie jest tutaj. Dlaczego opinie negatywne?
Eric
3
Chociaż różni się to nieco od twojego pierwotnego pytania: w twoim przykładzie org.apache.commons.io.FilenameUtils.getBaseName jest o wiele bardziej niezawodny niż wykonywanie własnych operacji na łańcuchach.
Do Schäfer
4
@Eric Całkowicie zgadzam się z twoim komentarzem, ponieważ był to pierwszy wynik Google dla mojego pytania, a zaakceptowana odpowiedź jest dokładnie tym, czego potrzebowałem.
thonnor

Odpowiedzi:

310
    String example = "/abc/def/ghfj.doc";
    System.out.println(example.substring(example.lastIndexOf("/") + 1));
Sébastien Le Callonnec
źródło
42

Bardzo prosta implementacja z 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
źródło
1
ten kod wyrzuci błąd Array Index Out of Bounds, jeśli separator nie zostanie znaleziony.
Patrick Parker,
36

czego próbowałeś to jest bardzo proste:

String s = "/abc/def/ghfj.doc";
s.substring(s.lastIndexOf("/") + 1)
vishal_aim
źródło
24

Innym sposobem jest użycie tego .

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

Jeśli przekażesz null tej metodzie, zwróci null. Jeśli nie ma zgodności z separatorem, zwróci pusty ciąg.

Alex Green
źródło
1
Wreszcie coś naprawdę przydatnego, nie wiedziałem o tej metodzie. Nienawidzę kłopotów z substringiem + indexof + 1 - 2 +3 w ogóle. To jest o wiele czystsze :)
BAERUS
Jeśli chcesz użyć tej metody na Androidzie, musisz zaimportować StringUtilsbibliotekę, ta odpowiedź pokazuje, jak to zrobić: stackoverflow.com/a/33935645/2966583
stramin
9

Możesz użyć wspólnego Apache:

W przypadku podciągów po ostatnim wystąpieniu użyj tego metody.

A dla podciągów po pierwszym wystąpieniu jest tutaj równoważna metoda .

Michał Przysucha
źródło
4

Może to również uzyskać nazwę pliku

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

Wydrukuje ghfj.doc

pushya
źródło
1

W Kotlin możesz użyć substringAfterLast, określając ogranicznik.

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

Z dokumentu :

Zwraca podciąg po ostatnim wystąpieniu ogranicznika. Jeśli ciąg nie zawiera ogranicznika, zwraca wartość brakujeDelimiterValue, która domyślnie przyjmuje oryginalny ciąg.

Filipe Brito
źródło
0

Myślę, że byłoby lepiej, gdybyśmy użyli bezpośrednio funkcji podziału

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

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

String returnValue = result[result.length - 1]; //equals "ghfj.doc"
użytkownik6317575
źródło
ten kod zgłosi błąd, jeśli separator nie zostanie znaleziony.
Patrick Parker,
@PatrickParker Dlaczego skomentowałeś wszędzie, że zgłosi błąd, jeśli separator nie zostanie znaleziony. Jeśli robisz to dla celów wiedzy niż w porządku, ale myślę, że to może trochę za dużo ...
Gaurav Mall
@GauravMall Pomagam ludziom ulepszać odpowiedzi, pisać lepszy kod, a tym, którzy odwiedzają, pomagają unikać pułapek i budować zrozumienie kodu, zanim gdzieś go wkleją. Z przyjemnością usunę mój komentarz, gdy poprawiona zostanie odpowiedź. Ponadto pisanie go w dwóch miejscach nie jest prawie „wszędzie”. Wreszcie sekcja komentarzy nie jest przeznaczona do meta dyskusji.
Patrick Parker,