URI का अंतिम पथ खंड कैसे प्राप्त करें


114

मेरे पास इनपुट के रूप में एक स्ट्रिंग है जो एक है URI। अंतिम पथ खंड (यह मेरे मामले में एक आईडी है) प्राप्त करना कैसे संभव है?

यह मेरा इनपुट URL है:

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

और मुझे उस आईडी को प्राप्त करना होगा जिसे मैंने इसके साथ आजमाया है:

String strId = "http://base_path/some_segment/id";
strId = strId.replace(path);
strId = strId.replaceAll("/", "");
Integer id =  new Integer(strId);
return id.intValue();

लेकिन यह काम नहीं करता है, और निश्चित रूप से इसे करने का एक बेहतर तरीका होना चाहिए।

जवाबों:


174

क्या यह वही है जिसको आप ढूंढ रहें थे:

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

49
मैं Android का Android.net.Uri (java.net.URI नहीं) खोज रहा था और यहीं समाप्त हुआ। यदि आप इसके बजाय उसका उपयोग कर रहे हैं, तो वहाँ एक तरीका है जिसे getLastPathSegment () कहा जाता है जो कि एक ही काम करना चाहिए। :)
pm_labs

5
बस String idStr = new File(uri.getPath()).getName(), इस उत्तर के समान है , लेकिन पथ को विभाजित करने के Fileबजाय उपयोग करता है String
जेसन सी

उदाहरण के लिए url जैसे काम के लिए यह अभ्‍यास काम नहीं करता है । अंतिम "/" मुसीबत बना रहा है। कुछ और अच्छे की जरूरत है getLastPathSegment () @paul_sns द्वारा दिया गया उत्तर एकदम सही है।
वैभव कदम

@ वैभवकदम अच्छी तरह से, तकनीकी रूप से आप यह तर्क दे सकते हैं कि अंतिम खंड एक खाली स्ट्रिंग है। लेकिन अगर वह नहीं है जो आप बस उपयोग करना चाहते हैं:while (path.endsWith("/")) path = path.substring(0, path.length() - 1);
sfussenegger

@sfussenegger मेरा बुरा मैं प्रश्न में TAGs नहीं पढ़ा था। मुझे लगा कि इसमें Android का टैग है। Android.net.uri के लिए खैर +1। :)। एंड्रॉइड जेएवीए को संभाल रहा है।
वैभव कदम

69
import android.net.Uri;
Uri uri = Uri.parse("http://example.com/foo/bar/42?param=true");
String token = uri.getLastPathSegment();

1
क्या यह "android.net.Uri" है? बेस दान प्रश्न के टैग, java.net.URI मान लिया जाएगा और यह एक getLastPathSegment () नहीं है ...
माइकल Geiser

इसके अलावा, एंड्रॉइड Uriवर्ग का नाम लोअरकेस है और इसे तत्काल नहीं किया जा सकता है मैंने स्थिर फ़ैक्टरी विधि का उपयोग करने के लिए आपके उत्तर को सही कर दिया है Uri.parse()
शांत

GetLastPathSegment यहां मौजूद नहीं है।
अब्दुल्ला शोएब

2
यह getLastPathSegment () है, लेकिन यह काम नहीं करता है! अशक्त!
जूनिया मोंटाना

GetLastPathSegment () की तरह लगता है कि बेतरतीब ढंग से मेरे लिए पूरा रास्ता निकाल देता है।
मोबदेव

48

यहाँ यह करने के लिए एक छोटी विधि है:

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
फू
बार

स्पष्टीकरण:

.*/      // 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

जबकि मैं regex का बहुत बड़ा प्रशंसक हूं और इसे अक्सर खुद उपयोग करता हूं, मैं मानता हूं कि अधिकांश डेवलपर्स के लिए, regex उतना ही अप्रिय है जितना कि इसे प्राप्त होता है। यह इस तथ्य में सरल नहीं है कि यह जल्दी समझ में नहीं आता है।
बिल टर्नर

/नकार चरित्र कक्षा में [^/?]है क्योंकि यह मिलान किया जा कभी नहीं होगा, अनावश्यक है। .*/हमेशा स्ट्रींग में आखिरी मैच करेगा /, इसलिए किसी अन्य /का सामना नहीं करना चाहिए।
स्टीफन वैन डेन अककर

इस तरह के लिंक के लिए काम नहीं करता है http://example.com/foo#reply2, यह बहुत अच्छा होगा यदि आप इसे हल करने के लिए अपने उत्तर को अपडेट कर सकते हैं। धन्यवाद
सेठ

23

मुझे पता है कि यह पुराना है, लेकिन यहाँ समाधान बल्कि क्रियात्मक लगते हैं। अगर आपके पास बस एक आसानी से पढ़ने योग्य एक लाइनर एक URLया URI:

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

या यदि आपके पास String:

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

क्या यह यूआरएल के सभी संभावित विकल्पों के साथ काम करता है, जैसे a.co/last?a=1#frag। मुझे लगता है कि नहीं, के रूप में कोड अंत तक अंतिम पथ प्रतीक का विकल्प है path.substring(index + 1):।
एलिकएल्ज़िन-किलाका

4
@alik अंतिम पथ खंड के लिए प्रश्न पूछता है। क्वेरी और टुकड़ा पथ खंड का हिस्सा नहीं हैं।
जेसन सी।

13

यदि आप Java 8 का उपयोग कर रहे हैं और आप एक फ़ाइल पथ में अंतिम सेगमेंट चाहते हैं जो आप कर सकते हैं।

Path path = Paths.get("example/path/to/file");
String lastSegment = path.getFileName().toString();

यदि आपके पास एक यूआरएल है जैसे कि http://base_path/some_segment/idआप कर सकते हैं।

final Path urlPath = Paths.get("http://base_path/some_segment/id");
final Path lastSegment = urlPath.getName(urlPath.getNameCount() - 1);

4
जोखिम भरा है क्योंकि java.nio.file.Paths # प्राप्त OS फाइल सिस्टम पर निर्भर करता है जिस पर JVM चल रहा है। वहाँ कोई गारंटी नहीं है कि यह पथ विभाजक के रूप में आगे के स्लैश के साथ एक URI को पहचान लेगा।
एड्रियन बेकर

2
क्वेरी परम के साथ URI के बारे में क्या? एक फ़ाइल सिस्टम पथ के रूप में एक यादृच्छिक URI का इलाज एक अपवाद के लिए पूछ रहा है।
अभिजीत सरकार

9

Android में

Android में URI के प्रबंधन के लिए एक अंतर्निहित वर्ग है।

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

कभी-कभी यह सिर्फ पूरा रास्ता निकाल देता है। निश्चित नहीं है कि क्यों या कब यह यादृच्छिक लगता है।
मोबिवेव

यदि आप उस सामग्री को पकड़ सकते हैं जिसे वह पार्स कर रहा है, तो आप यह सुनिश्चित करने के लिए एक इकाई परीक्षण स्थापित कर सकते हैं।
ब्रिल पप्पिन

8

जावा 7+ में पिछले उत्तरों में से कुछ को केवल अंतिम सेगमेंट के बजाय URI से किसी भी पथ खंड की पुनर्प्राप्ति की अनुमति देने के लिए जोड़ा जा सकता है । हम 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();

कोड की एक पंक्ति में अंतिम खंड प्राप्त करने के लिए, बस ऊपर की पंक्तियों को घोंसले में रखें।

Paths.get(URI.create("http://base_path/some_segment/id").getPath()).getFileName().toString()

इंडेक्स नंबरों से बचने और ऑफ-बाय-वन त्रुटियों के लिए दूसरे-से-अंतिम सेगमेंट को प्राप्त करने के लिए, getParent()विधि का उपयोग करें ।

String secondToLast = path.getParent().getFileName().toString();

नोट getParent()विधि को रिवर्स ऑर्डर में सेगमेंट प्राप्त करने के लिए बार-बार बुलाया जा सकता है। इस उदाहरण में, पथ में केवल दो खंड हैं, अन्यथा कॉलिंग getParent().getParent()तीसरे-से-अंतिम खंड को पुनर्प्राप्त करेगी।


6

यदि आपने 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


3

आप 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



0

मैं एक उपयोगिता वर्ग में निम्नलिखित का उपयोग कर रहा हूं:

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

-1

URI से URL प्राप्त करें और getFile () का उपयोग करें यदि आप फ़ाइल निकालने के प्रतिस्थापन तरीके का उपयोग करने के लिए तैयार नहीं हैं।


2
काम नहीं करेगा, getFile का javadoc देखें (): इस URL का फ़ाइल नाम हो जाता है। लौटाया गया फ़ाइल भाग getPath (), प्लस getQuery (), यदि कोई हो, के मान का समरूप होगा। यदि कोई क्वेरी भाग नहीं है, तो यह विधि और getPath () समान परिणाम
लौटाएगी

उपयोग getPath()न करें getFile()
जेसन सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.