入力にURI
である文字列があります。最後のパスセグメントを取得するにはどうすればよいですか?私の場合、それはIDですか?
これは私の入力URLです
String uri = "http://base_path/some_segment/id"
そして、私はこれで試したIDを取得する必要があります
String strId = "http://base_path/some_segment/id";
strId=strId.replace(path);
strId=strId.replaceAll("/", "");
Integer id = new Integer(strId);
return id.intValue();
しかし、それは機能せず、確かにそれを行うためのより良い方法があります。
あなたが探しているものです:
URI uri = new URI("http://example.com/foo/bar/42?param=true");
String path = uri.getPath();
String idStr = path.substring(path.lastIndexOf('/') + 1);
int id = Integer.parseInt(idStr);
代わりに
URI uri = new URI("http://example.com/foo/bar/42?param=true");
String[] segments = uri.getPath().split("/");
String idStr = segments[segments.length-1];
int id = Integer.parseInt(idStr);
import Android.net.Uri;
Uri uri = Uri.parse("http://example.com/foo/bar/42?param=true");
String token = uri.getLastPathSegment();
これを行う簡単な方法を次に示します。
public static String getLastBitFromUrl(final String url){
// return url.replaceFirst("[^?]*/(.*?)(?:\\?.*)","$1);" <-- incorrect
return url.replaceFirst(".*/([^/?]+).*", "$1");
}
テストコード:
public static void main(final String[] args){
System.out.println(getLastBitFromUrl(
"http://example.com/foo/bar/42?param=true"));
System.out.println(getLastBitFromUrl("http://example.com/foo"));
System.out.println(getLastBitFromUrl("http://example.com/bar/"));
}
出力:
42
foo
バー
説明:
.*/ // find anything up to the last / character
([^/?]+) // find (and capture) all following characters up to the next / or ?
// the + makes sure that at least 1 character is matched
.* // find all following characters
$1 // this variable references the saved second group from above
// I.e. the entire string is replaces with just the portion
// captured by the parentheses above
私はこれが古いことを知っていますが、ここでの解決策はかなり冗長に見えます。 URL
またはURI
を持っている場合、読みやすいワンライナーです。
String filename = new File(url.getPath()).getName();
または、String
がある場合:
String filename = new File(new URL(url).getPath()).getName();
Java 8を使用していて、ファイルパスの最後のセグメントが必要な場合は、実行できます。
Path path = Paths.get("example/path/to/file");
String lastSegment = path.getFileName().toString();
http://base_path/some_segment/id
などのURLがある場合は実行できます。
final Path urlPath = Paths.get("http://base_path/some_segment/id");
final Path lastSegment = urlPath.getName(urlPath.getNameCount() - 1);
Java 7+では、以前の回答のいくつかを組み合わせて、URIからanyパスセグメントを取得できるようにします。最後のセグメントだけ。 URIを Java.nio.file.Path
オブジェクトに変換して、その getName(int)
メソッドを利用できます。
残念ながら、静的ファクトリPaths.get(uri)
はhttpスキームを処理するように構築されていないため、最初にスキームをURIのパスから分離する必要があります。
URI uri = URI.create("http://base_path/some_segment/id");
Path path = Paths.get(uri.getPath());
String last = path.getFileName().toString();
String secondToLast = path.getName(path.getNameCount() - 2).toString();
コードの1行で最後のセグメントを取得するには、上記の行を単純にネストします。
Paths.get(URI.create("http://base_path/some_segment/id").getPath()).getFileName().toString()
インデックス番号とオフバイワンエラーの可能性を回避しながら最後から2番目のセグメントを取得するには、 getParent()
メソッドを使用します。
String secondToLast = path.getParent().getFileName().toString();
getParent()
メソッドを繰り返し呼び出して、逆順でセグメントを取得できることに注意してください。この例では、パスには2つのセグメントのみが含まれています。そうでない場合、getParent().getParent()
を呼び出すと、最後から3番目のセグメントが取得されます。
Androidの場合
Androidには、URIを管理するための組み込みクラスがあります。
Uri uri = Uri.parse("http://base_path/some_segment/id");
String lastPathSegment = uri.getLastPathSegment()
getPathSegments()
関数を使用できます。 ( Androidドキュメント )
URIの例を考えてみましょう。
String uri = "http://base_path/some_segment/id"
次を使用して最後のセグメントを取得できます。
List<String> pathSegments = uri.getPathSegments();
String lastSegment = pathSegments.get(pathSegments.size - 1);
lastSegment
はid
になります。
プロジェクトにcommons-io
が含まれている場合は、org.Apache.commons.io.FilenameUtils
で不要なオブジェクトを作成せずにそれを実行できます
String uri = "http://base_path/some_segment/id";
String fileName = FilenameUtils.getName(uri);
System.out.println(fileName);
パスの最後の部分であるid
を提供します
私はユーティリティクラスで次を使用しています。
public static String lastNUriPathPartsOf(final String uri, final int n, final String... Ellipsis)
throws URISyntaxException {
return lastNUriPathPartsOf(new URI(uri), n, Ellipsis);
}
public static String lastNUriPathPartsOf(final URI uri, final int n, final String... Ellipsis) {
return uri.toString().contains("/")
? (Ellipsis.length == 0 ? "..." : Ellipsis[0])
+ uri.toString().substring(StringUtils.lastOrdinalIndexOf(uri.toString(), "/", n))
: uri.toString();
}