web-dev-qa-db-ja.com

URIの最後のパスセグメントを取得する方法

入力に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();

しかし、それは機能せず、確かにそれを行うためのより良い方法があります。

95
DX89B

あなたが探しているものです:

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);
152
sfussenegger
import Android.net.Uri;
Uri uri = Uri.parse("http://example.com/foo/bar/42?param=true");
String token = uri.getLastPathSegment();
59
Colateral

これを行う簡単な方法を次に示します。

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
47

私はこれが古いことを知っていますが、ここでの解決策はかなり冗長に見えます。 URLまたはURIを持っている場合、読みやすいワンライナーです。

String filename = new File(url.getPath()).getName();

または、Stringがある場合:

String filename = new File(new URL(url).getPath()).getName();
21
Jason C

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);
8
Will Humphreys

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番目のセグメントが取得されます。

7
jaco0646

Androidの場合

Androidには、URIを管理するための組み込みクラスがあります。

Uri uri = Uri.parse("http://base_path/some_segment/id");
String lastPathSegment = uri.getLastPathSegment()
6
Brill Pappin

getPathSegments()関数を使用できます。 ( Androidドキュメント

URIの例を考えてみましょう。

String uri = "http://base_path/some_segment/id"

次を使用して最後のセグメントを取得できます。

List<String> pathSegments = uri.getPathSegments();
String lastSegment = pathSegments.get(pathSegments.size - 1);

lastSegmentidになります。

3
Sina Masnadi

プロジェクトに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を提供します

2
Bnrdo

私はユーティリティクラスで次を使用しています。

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