Java: ottenere una sottostringa da una stringa che inizia dopo un determinato carattere


196

Ho una stringa:

/abc/def/ghfj.doc

Vorrei estrarre ghfj.docda questo, vale a dire la sottostringa dopo l'ultima /o la prima /da destra.

Qualcuno potrebbe fornire aiuto?


39
guarda, capisco il valore della ricerca della risposta da solo prima di porre domande, ma il fatto è che questa domanda ha reso la mia ricerca molto più semplice .. esattamente quello che volevo dopo il primo colpo. Più veloce di consultare javadocs. È positivo che questa domanda sia qui. Perché i downvotes?
Eric,

3
Anche se questo è in qualche modo diverso dalla domanda originale: nell'esempio org.apache.commons.io.FilenameUtils.getBaseName è molto più affidabile che eseguire le proprie operazioni su stringa.
Fino a Schäfer il

4
@Eric Sono completamente d'accordo con il tuo commento in quanto questo è stato il primo risultato di Google per la mia domanda e la risposta accettata è esattamente quello che dovevo usare.
thonnor,

Risposte:



42

Un'implementazione molto semplice con 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
questo codice genererà un errore Out of Bounds Index dell'array se non viene trovato il separatore.
Patrick Parker,

36

cosa hai provato è molto semplice:

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

23

Un altro modo è quello di utilizzare questo .

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

Se si passa null a questo metodo, verrà restituito null. Se non c'è corrispondenza con il separatore, verrà restituita una stringa vuota.


1
Finalmente qualcosa di veramente utile, non sapeva di questo metodo. Odio seccatura con sottostringa + indexof + 1 - 2 +3 qualunque. Questo è molto più pulito :)
BAERUS

Se si desidera utilizzare questo metodo su Android, è necessario importare StringUtilsbiblioteca, questa risposta spettacoli hot per farlo: stackoverflow.com/a/33935645/2966583
Stramin

9

Puoi usare i comuni di Apache:

Per sottostringa dopo l'ultima occorrenza utilizzare questo metodo.

E per la sottostringa dopo la prima occorrenza il metodo equivalente è qui .


4

Questo può anche ottenere il nome file

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

Stamperà ghfj.doc



1

In Kotlin puoi usare substringAfterLast, specificando un delimitatore.

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

Dal documento :

Restituisce una sottostringa dopo l'ultima occorrenza del delimitatore. Se la stringa non contiene il delimitatore, restituisce missingDelimiterValue che per impostazione predefinita è la stringa originale.


0

Penso che sarebbe meglio se usiamo direttamente la funzione split

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

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

String returnValue = result[result.length - 1]; //equals "ghfj.doc"

questo codice genererà un errore se il separatore non viene trovato.
Patrick Parker,

@PatrickParker Perché hai commentato ovunque che genererà un errore se il separatore non viene trovato. Se lo stai facendo per scopi di conoscenza piuttosto che ok, ma penso solo che sia un po 'troppo forse ...
Gaurav Mall

@GauravMall Sto aiutando le persone a migliorare le loro risposte, a scrivere un codice migliore e per coloro che stanno visitando per aiutarli a evitare insidie ​​e costruire la comprensione del codice prima di incollarlo da qualche parte. Rimuoverò volentieri il mio commento una volta che la risposta sarà migliorata. Inoltre, scriverlo in due posti non è quasi "ovunque". Infine, la sezione dei commenti non è per la meta discussione.
Patrick Parker,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.