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

Posted

技术标签:

【中文标题】Java:从特定字符后开始的字符串中获取子字符串【英文标题】:Java: Getting a substring from a string starting after a particular character 【发布时间】:2012-12-28 07:08:12 【问题描述】:

我有一个字符串:

/abc/def/ghfj.doc

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

有人可以帮忙吗?

【问题讨论】:

看,我明白在提问之前自己寻找答案的价值,但事实是这个问题让我的搜索变得更加容易......正是我在第一次点击后想要的。比咨询 javadocs 更快。这个问题在这里很好。为什么投反对票? 虽然这与你原来的问题有些不同:在你的例子中 org.apache.commons.io.FilenameUtils.getBaseName 比你自己的字符串操作更可靠。 @Eric 我完全同意您的评论,因为这是我的问题的第一个 Google 结果,而接受的答案正是我需要使用的。 【参考方案1】:

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

【讨论】:

如果没有找到分隔符,这段代码会抛出数组索引越界错误。【参考方案2】:
String example = "/abc/def/ghfj.doc";
System.out.println(example.substring(example.lastIndexOf("/") + 1));

【讨论】:

【参考方案3】:

你试过什么? 很简单:

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

【讨论】:

【参考方案4】:

我觉得直接用split函数会更好

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

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

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

【讨论】:

如果没有找到分隔符,这段代码会抛出错误。 @PatrickParker 为什么你到处评论说如果找不到分隔符会抛出错误。如果您是出于知识目的而这样做,那还不错,但我只是认为这可能有点太多了... @GauravMall 我正在帮助人们改进他们的答案,编写更好的代码,并帮助那些正在访问的人避免陷阱并在将代码粘贴到某个地方之前建立对代码的理解。一旦答案得到改善,我很乐意删除我的评论。此外,在两个地方写它几乎不是“无处不在”。最后,评论部分不用于元讨论。【参考方案5】:

您可以使用 Apache commons:

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

对于第一次出现后的子字符串,等效方法是here。

【讨论】:

【参考方案6】:

这也可以获取文件名

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

【讨论】:

【参考方案7】:

另一种方法是使用this。

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

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

【讨论】:

终于有个很方便的东西了,不知道这个方法。我讨厌用 substring + indexof + 1 - 2 +3 来麻烦。这更干净:) 如果你想在android上使用这个方法,你必须导入StringUtils库,这个答案很热:***.com/a/33935645/2966583【参考方案8】:

在 Kotlin 中,您可以使用 substringAfterLast,指定分隔符。

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

来自doc:

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

【讨论】:

【参考方案9】:

使用Guava 执行此操作:

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

最终配置Splitter并使用

Splitter.on("/")
.trimResults()
.omitEmptyStrings()
...

还可以查看this article on guava Splitter 和this article on guava Iterables

【讨论】:

请注意,由于为每个分割点创建额外的对象,此解决方案如果不是非常有效。 @Vadzim 正确。应该考虑这一点。另请参阅此讨论:***.com/questions/42584477/…【参考方案10】:

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());
     

【讨论】:

以上是关于Java:从特定字符后开始的字符串中获取子字符串的主要内容,如果未能解决你的问题,请参考以下文章

PB中取字符串子串的函数是啥

字符串子串的查找

如何在Java中将字符串子串到第二个点(。)?

求字符串不同子串个数

华为OD机试真题Java实现判断字符串子序列真题+解题思路+代码(2022&2023)

java 从一个URL中提取特定子字符串保存