Java:从一个特定字符之后开始获取字符串的子串

254

我有一个字符串:

/abc/def/ghfj.doc

我想从中提取ghfj.doc,也就是最后一个/之后的子字符串,或者从右边数起的第一个/

请问有人能提供一些帮助吗?


53
我明白在提问前自己寻找答案的价值,但事实是这个问题让我的搜索变得更加容易。第一个搜索结果就是我想要的,比查询Javadocs还要快。很高兴有这个问题存在。为什么会有人投反对票呢? - Eric
3
虽然这与您原来的问题有些不同,但在您的示例中,org.apache.commons.io.FilenameUtils.getBaseName比进行自己的字符串操作更可靠。 - Till Schäfer
5
@Eric,我完全同意你的评论,因为这是我提出的问题的第一个谷歌搜索结果,而且被接受的答案正是我需要使用的内容。 - thonnor
10个回答

396
String example = "/abc/def/ghfj.doc";
System.out.println(example.substring(example.lastIndexOf("/") + 1));

53

使用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
如果未找到分隔符,此代码将抛出数组越界错误。 - Patrick Parker

44

你尝试过什么?很简单:

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

35

另一种方法是使用这个

String path = "/abc/def/ghfj.doc"
String fileName = StringUtils.substringAfterLast(path, "/");
如果您将null传递给此方法,则它将返回null。如果没有与分隔符匹配的内容,则它将返回空字符串。

1
终于有了真正方便的东西,之前不知道这个方法。我讨厌用substring + indexof + 1 - 2 +3等等这些麻烦的方法。这个方法更加简洁 :) - BAERUS
如果你想在Android上使用这个方法,你必须导入StringUtils库,这个答案展示了如何做到:https://stackoverflow.com/a/33935645/2966583 - stramin

12
你可以使用Apache Commons:
要获取最后一次出现后的子字符串,请使用此方法
而对于第一次出现后的子字符串,相应的方法为此处

8

这也可以获取文件名

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


6
在Kotlin中,您可以使用substringAfterLast,指定一个分隔符。
val string = "/abc/def/ghfj.doc"
val result = url.substringAfterLast("/")
println(result)
// It will show ghfj.doc

来自文档

返回分隔符最后一次出现后的子字符串。如果字符串不包含分隔符,则返回默认为原始字符串的missingDelimiterValue。


4
使用Guava库,可以这样做:

Guava

String id="/abc/def/ghfj.doc";
String valIfSplitIsEmpty="";
return Iterables.getLast(Splitter.on("/").split(id),valIfSplitIsEmpty);

最终配置 Splitter 并使用。
Splitter.on("/")
.trimResults()
.omitEmptyStrings()
...

同时请查看关于guava Splitter的这篇文章以及关于guava Iterables的这篇文章


请注意,由于为每个分割点创建额外的对象,因此这种解决方案并不十分有效。 - Vadzim
1
@Vadzim 正确。这应该被考虑。还请参阅此讨论:https://dev59.com/7p_ha4cB1Zd3GeqP2q7I - jschnasse

0

我认为如果我们直接使用分割函数会更好。

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

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

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

如果未找到分隔符,此代码将引发错误。 - Patrick Parker
@PatrickParker 为什么你到处都评论说如果找不到分隔符就会抛出错误。如果你是为了知识目的而这样做,那还好,但我认为可能有点过了... - Gaurav Mall
@GauravMall 我正在帮助人们改进他们的答案,编写更好的代码,并为那些来访者提供帮助,帮助他们避免陷阱并在将其粘贴到某个地方之前建立对代码的理解。一旦答案得到改进,我会很乐意删除我的评论。此外,在两个地方写它几乎不算“到处”。最后,评论区不是用于元讨论的地方。 - Patrick Parker

0

Java安卓

在我的情况下

我想要改变自

~/propic/........png

/propic/后面的任何内容都不重要

........png

最终,我在Class StringUtils找到了代码

这是代码

     public static String substringAfter(final String str, final String separator) {
         if (isEmpty(str)) {
             return str;
         }
         if (separator == null) {
             return "";
         }
         final int pos = str.indexOf(separator);
         if (pos == 0) {
             return str;
         }
         return str.substring(pos + separator.length());
     }

substringAfter("abc", "a") == "abc" 这个不像原来的substring after函数那样工作。 - R A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接