Java:从特定字符之后的字符串中获取子字符串


195

我有一个字符串:

/abc/def/ghfj.doc

我想从中提取ghfj.doc,即last //从右开始的子字符串。

有人可以帮忙吗?


38
看起来,我知道在问问题之前自己寻找答案的价值,但事实上,这个问题使我的搜索更加容易..正是我第一次点击后想要的。比咨询javadocs更快。很好,这个问题在这里。为什么要下票?
埃里克

3
尽管这与您的原始问题有所不同:在您的示例中,org.apache.commons.io.FilenameUtils.getBaseName比执行自己的字符串操作可靠得多。
TillSchäfer2015年

4
@Eric我完全同意您的评论,因为这是我提出问题的第一个Google结果,被接受的答案正是我需要使用的答案。
thonnor

Answers:



41

一个非常简单的实现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 Of Bounds错误。
帕特里克·帕克

36

你尝试了什么?这很简单:

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

23

另一种方法是使用此方法

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

如果将null传递给此方法,它将返回null。如果与分隔符不匹配,它将返回空字符串。


1
最后,确实有一些方便的方法,对此方法一无所知。我讨厌麻烦子字符串+ indexof + 1-2 +3。这要干净得多:)
BAERUS

如果要在Android上使用此方法,则必须导入StringUtils库,此答案非常
有用

9

您可以使用Apache Commons:

对于最后一次出现后的子字符串,请使用方法。

对于第一次出现后的子字符串,等效方法在这里


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

我认为如果直接使用split函数会更好

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

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

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

如果找不到分隔符,则此代码将引发错误。
帕特里克·帕克

@PatrickParker为什么您到处都有评论,如果找不到分隔符,它将引发错误。如果您出于知识目的而不是这样做,但我只是觉得可能有点过分……
Gaurav Mall

@GauravMall我正在帮助人们改善答案,编写更好的代码,并为那些正在访问的人们提供帮助,避免他们陷入陷阱并在将代码粘贴到某处之前加深对代码的理解。答案得到改善后,我将很乐意删除我的评论。另外,很难将其写在两个地方。最后,评论部分不适合元讨论。
帕特里克·帕克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.