Java: obtener una subcadena de una cadena que comienza después de un carácter en particular

196

Tengo una cadena:

/abc/def/ghfj.doc

Me gustaría extraer ghfj.docde esto, es decir, la subcadena después de la última /, o la primera /desde la derecha.

¿Podría alguien ayudarme?

Soleado
fuente
39
Mire, entiendo el valor de buscar la respuesta usted mismo antes de hacer preguntas, pero el hecho es que esta pregunta hizo mi búsqueda mucho más fácil ... exactamente lo que quería después del primer golpe. Más rápido que consultar javadocs. Es bueno que esta pregunta esté aquí. ¿Por qué los votos negativos?
Eric
3
Aunque esto es algo diferente de su pregunta original: en su ejemplo org.apache.commons.io.FilenameUtils.getBaseName es mucho más confiable que hacer sus propias operaciones de cadena.
Hasta Schäfer el
44
@Eric Estoy completamente de acuerdo con tu comentario, ya que este fue el primer resultado de Google para mi pregunta y la respuesta aceptada es exactamente lo que necesitaba usar.
thonnor

Respuestas:

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

Una implementación muy simple 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];
Veger
fuente
1
este código arrojará un error de Array Index Out of Bounds si no se encuentra el separador.
Patrick Parker
36

que has intentado es muy simple:

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

Otra forma es usar esto .

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

Si pasa nulo a este método, devolverá nulo. Si no hay coincidencia con el separador, devolverá una cadena vacía.

Alex Green
fuente
1
Finalmente algo realmente útil, no sabía sobre este método. Odio molestar con la subcadena + índice de + 1 - 2 +3 en absoluto. Esto es mucho más limpio :)
BAERUS
Si desea utilizar este método en Android, debe importar la StringUtilsbiblioteca, esta respuesta muestra lo mejor para hacerlo: stackoverflow.com/a/33935645/2966583
stramin
9

Puedes usar los comunes de Apache:

Para la subcadena después de la última aparición, use este método.

Y para la subcadena después de la primera aparición, el método equivalente está aquí .

Michal Przysucha
fuente
4

Esto también puede obtener el nombre de archivo

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

Imprimirá ghfj.doc

Pushya
fuente
1

En Kotlin puede usar substringAfterLast, especificando un delimitador.

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

Desde el documento :

Devuelve una subcadena después de la última aparición del delimitador. Si la cadena no contiene el delimitador, devuelve missingDelimiterValue que por defecto es la cadena original.

Filipe Brito
fuente
0

Creo que sería mejor si utilizamos directamente la función de división

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

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

String returnValue = result[result.length - 1]; //equals "ghfj.doc"
usuario6317575
fuente
este código arrojará un error si no se encuentra el separador.
Patrick Parker
@PatrickParker ¿Por qué has comentado en todas partes que arrojará un error si no se encuentra el separador? Si lo está haciendo con fines de conocimiento que bien, pero creo que es demasiado, tal vez ...
Gaurav Mall
@GauravMall Estoy ayudando a las personas a mejorar sus respuestas, a escribir un mejor código, y a aquellos que están de visita para ayudarlos a evitar dificultades y desarrollar la comprensión del código antes de pegarlo en algún lugar. Con mucho gusto eliminaré mi comentario una vez que se mejore la respuesta. Además, escribirlo en dos lugares es apenas "en todas partes". Finalmente, la sección de comentarios no es para meta discusión.
Patrick Parker