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?


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:



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];

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)

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.


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 .


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



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.


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"

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.