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?


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:



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

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)

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.


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í .


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



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.


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"

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.