Java:特定の文字の後に始まる文字列から部分文字列を取得する


196

文字列があります:

/abc/def/ghfj.doc

これからghfj.doc、つまり、lastの後の部分文字列/、または最初/から右から抽出したいと思います。

誰かが助けを提供してくれませんか?


39
見て、私は質問する前に自分で答えを検索することの価値を理解していますが、問題は、この質問のおかげで私の検索がはるかに簡単になったということです。javadocsを参照するよりも迅速です。この質問がここにあるのは良いことです。なぜ反対票?
Eric

3
これは元の質問とは多少異なりますが、例では、org.apache.commons.io.FilenameUtils.getBaseNameは、独自の文字列操作を実行するよりもはるかに信頼性が高くなっています。
シェーファーまで2015年

4
@Eric私はあなたのコメントに完全に同意します。これは私の質問に対する最初のGoogleの結果であり、受け入れられた回答はまさに私が使用する必要があったものだからです。
16年

回答:



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
このコードは、セパレーターが見つからない場合、配列インデックスの範囲外エラーをスローします。
Patrick Parker

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での面倒を嫌います。これはもっと
すっきりしています

あなたは、Android上でこのメソッドを使用する場合は、インポートする必要があります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"

セパレータが見つからない場合、このコードはエラーをスローします。
Patrick Parker、

@PatrickParker区切り記号が見つからない場合にエラーがスローされるとコメントしたのはなぜですか。あなたが大丈夫というより知識の目的でそれをしているなら、それは多分少し多すぎると思います...
ガウラブモール

@GauravMall私は人々が答えを改善したり、より良いコードを書いたり、どこかに貼り付ける前に落とし穴を回避したり、コードを理解したりするために訪れている人々を助けています。回答が改善されたら、コメントを喜んで削除します。また、2か所で書くことは「どこでも」できることはほとんどありません。最後に、コメントセクションはメタディスカッション用ではありません。
Patrick Parker
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.