Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从特定字符后开始的字符串中获取子字符串_Java_String_Substring - Fatal编程技术网

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

Java:从特定字符后开始的字符串中获取子字符串,java,string,substring,Java,String,Substring,我有一个字符串: /abc/def/ghfj.doc 我想从中提取ghfj.doc,即最后一个/后的子字符串,或从右侧提取第一个/ 有人能提供一些帮助吗?一个非常简单的实现,包括: String-example=“/abc/def/ghfj.doc”; System.out.println(example.substring(example.lastIndexOf(“/”)+1)); 你试过什么? 很简单: String s = "/abc/def/ghfj.doc"; s.substring

我有一个字符串:

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


有人能提供一些帮助吗?

一个非常简单的实现,包括:

String-example=“/abc/def/ghfj.doc”;
System.out.println(example.substring(example.lastIndexOf(“/”)+1));
你试过什么? 很简单:

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

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

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

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

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

您可以使用Apache commons:

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


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

这也可以获得文件名

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

另一种方法是使用


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

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

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

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

要做到这一点:

最终配置
拆分器
并使用

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

还可以查看和

java android

就我而言

我想从

~/propic/…png

/propic/之后的任何内容都与之前的内容无关

……巴布亚新几内亚

最后,我在中找到了代码

这是密码

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

听着,我理解在提问之前自己寻找答案的价值,但事实是这个问题让我的搜索变得容易多了。。这正是我第一次击中后想要的。比查阅javadocs更快。这个问题在这里很好。为什么反对票?虽然这与您最初的问题有些不同:在您的示例中,org.apache.commons.io.FilenameUtils.getBaseName比您自己的字符串操作可靠得多。@Eric我完全同意您的评论,因为这是我问题的第一个Google结果,被接受的答案正是我想要的需要使用。最后一些非常方便的东西,不知道这个方法。我讨厌和substring+indexof+1-2+3之类的东西争论。这更干净:)如果你想在Android上使用这种方法,你必须导入
StringUtils
library,这个答案显示了做这件事的热度:工作完美无瑕!如果找不到分隔符,此代码将抛出一个错误。@PatrickParker为什么到处都评论说如果找不到分隔符,它将抛出一个错误。如果你是出于知识的目的而做的,那就好了,但我只是觉得这可能有点太多了…@GauravMall我正在帮助人们改进答案,编写更好的代码,并帮助来访者在粘贴代码之前避免陷阱并建立对代码的理解。一旦答案得到改进,我将很乐意删除我的评论。此外,在两个地方写它也很难“无处不在”。最后,注释部分不用于元讨论。如果未找到分隔符,此代码将抛出数组索引越界错误。请注意,由于为每个分割点创建了额外的对象,此解决方案可能不是非常有效。@Vadzim Correct。这是应该考虑的。也可以看到这个讨论:完美无瑕!
String id="/abc/def/ghfj.doc";
String valIfSplitIsEmpty="";
return Iterables.getLast(Splitter.on("/").split(id),valIfSplitIsEmpty);
Splitter.on("/")
.trimResults()
.omitEmptyStrings()
...
     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());
     }