Java : 특정 문자 다음에 시작하는 문자열에서 하위 문자열 가져 오기


198

문자열이 있습니다.

/abc/def/ghfj.doc

ghfj.doc이것에서 추출 하고 싶습니다 . 즉, 마지막 이후 /또는 처음 /부터 하위 문자열 입니다.

누군가 도움을 줄 수 있습니까?


40
봐, 나는 질문을하기 전에 스스로 답변을 검색의 가치를 이해하지만, 문제의 사실은이 질문이 내 검색을 훨씬 쉽게 만들었습니다.. 첫 번째 히트 후 정확히 내가 원하는 것. javadocs에 문의하는 것보다 빠릅니다. 이 질문이있는 것이 좋습니다. 왜 다운 보트인가?
Eric

3
이것은 원래 질문과 약간 다르지만 예에서 org.apache.commons.io.FilenameUtils.getBaseName은 자체 문자열 작업을 수행하는 것보다 훨씬 안정적입니다.
Till Schäfer

4
@Eric 나는 이것이 내 질문에 대한 첫 번째 Google 결과이고 귀하의 답변이 정확히 내가 사용했던 것이므로 귀하의 의견에 전적으로 동의합니다.
thonnor

답변:



42

매우 간단한 구현 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
이 코드는 구분자를 찾을 수없는 경우 Array Index Out of Bounds 오류를 발생시킵니다.
패트릭 파커

36

무엇을 시도 했습니까? 매우 간단합니다.

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

24

또 다른 방법은 이것을 사용 하는 것 입니다.

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

이 메소드에 널을 전달하면 널을 리턴합니다. 구분 기호와 일치하지 않으면 빈 문자열을 반환합니다.


1
마지막으로 정말 편리한 방법은이 방법에 대해 몰랐습니다. 나는 하위 문자열 + indexof + 1-2 +3로 번거 로워하는 것을 싫어합니다. 이것은 훨씬 더 깨끗합니다 :)
BAERUS

당신이 안드로이드에이 방법을 사용하려면, 당신은 수입에있는 StringUtils도서관, 뜨거운이 답변 쇼는 그것을 할 수 있습니다 : stackoverflow.com/a/33935645/2966583
stramin


4

이것은 또한 파일 이름을 얻을 수 있습니다

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

인쇄합니다 ghfj.doc



1

Kotlin에서는 substringAfterLast구분자를 지정 하여을 사용할 수 있습니다 .

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

로부터 문서 :

구분자가 마지막으로 나타난 후 부분 문자열을 반환합니다. 문자열에 구분자가 포함되어 있지 않으면 missingDelimiterValue를 반환합니다. 기본값은 원래 문자열입니다.


0

분할 기능을 직접 사용하면 더 좋을 것이라고 생각합니다.

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

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

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

구분 기호를 찾지 못하면이 코드에서 오류가 발생합니다.
패트릭 파커

@PatrickParker 왜 구분 기호를 찾을 수 없으면 오류가 발생한다고 모든 곳에서 주석을 달았습니다. 당신이 괜찮은 것보다 지식의 목적을 위해 그것을하고 있다면, 나는 단지 그것이 너무 많은 것 같아요 ...
Gaurav Mall

@GauravMall 나는 사람들이 답변을 개선하고 더 나은 코드를 작성하도록 도와주고 방문하는 사람들이 함정을 피하고 코드를 어딘가에 붙여 넣기 전에 이해하도록 도와줍니다. 답변이 개선되면 기꺼이 댓글을 삭제하겠습니다. 또한, 두 곳에서 쓰는 것은 거의 "모든 곳"이 아닙니다. 마지막으로 주석 섹션은 메타 토론을위한 것이 아닙니다.
패트릭 파커
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.