কীভাবে কোনও ইউআরআইয়ের শেষ পাথ বিভাগটি পাওয়া যায়


114

আমার কাছে ইনপুট হিসাবে একটি স্ট্রিং রয়েছে যা একটি URI । কীভাবে সম্ভব হবে শেষ পাথ বিভাগটি (আমার ক্ষেত্রে এটি একটি আইডি)?

এটি আমার ইনপুট ইউআরএল:

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.net.Uri (java.net.URI নয়) অনুসন্ধান করে এখানে এসেছি। আপনি যদি এর পরিবর্তে এটি ব্যবহার করে থাকেন তবে সেখানে getLastPathSeament () নামে একটি পদ্ধতি আছে যা একই জিনিসটি করা উচিত। :)
pm_labs

5
কেবল String idStr = new File(uri.getPath()).getName()এই উত্তর হিসাবে একই করুন তবে পথটি বিভক্ত করার Fileপরিবর্তে ব্যবহার করুন String
জেসন সি

এটি উদাহরণস্বরূপ / কাজের / পরামর্শদাতা- স্বাস্থ্য- এবং- পুষ্টি- অ্যাডভাইজার / ? param= true মত url এর জন্য কাজ করবে না । শেষ "/" সমস্যা তৈরি করছে। @Pul_sns দ্বারা প্রদত্ত আরও কিছু ভাল getLastPathSeament () উত্তর দরকার।
বৈভব কদম

@ বৈভবকদম ভাল, প্রযুক্তিগতভাবে আপনি যুক্তি দিতে পারেন যে শেষ বিভাগটি খালি স্ট্রিং। তবে যদি আপনি যা ব্যবহার করতে চান তা যদি না হয়:while (path.endsWith("/")) path = path.substring(0, path.length() - 1);
এসফুসনেগার

@ এসফুসনেগার আমার খারাপ আমি প্রশ্নে ট্যাগগুলি পড়িনি। আমি ভেবেছিলাম এটিতে অ্যান্ড্রয়েডের ট্যাগ রয়েছে। 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()
চুপচাপ

গেটলাস্টপ্যাথসেটমেন্টটি এখানে নেই।
আবদুল্লাহ শোয়েব

2
এটিতে লাস্টপ্যাথসেজমেন্ট রয়েছে () তবে এটি কার্যকর হয় না! নাল ফেরায়!
জুনিয়া মন্টানা

GetLastPathSeament () এলোমেলোভাবে আমার জন্য পুরো পথটি ছড়িয়ে দেয় See
মোবিডেভ

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

আমি যখন রেজেক্সের একটি বড় অনুরাগী এবং নিজেই এটি ঘন ঘন ব্যবহার করি, তখন আমি বুঝতে পারি যে বেশিরভাগ বিকাশকারীদের জন্য, রেগেক্স যতটা ওবটজ হয় ততই তার মতো use এটি সহজে বোঝা যায় না যে এটি সহজ নয়।
বিল টার্নার

/অস্বীকার চরিত্র ক্লাসে [^/?]কারণ এটি মিলেছে করা হবে না, অপ্রয়োজনীয়। .*/স্ট্রিংয়ে সর্বদা সর্বশেষের / সাথে মিলবে , সুতরাং অন্য /কোনওটির মুখোমুখি হওয়া উচিত নয়।
স্টিফান ভ্যান ডান আকার

এই ধরণের লিঙ্কটির জন্য কাজ করে না 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

আপনি যদি জাভা 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 # পেতে ওএস ফাইল সিস্টেমের উপর নির্ভর করে জেভিএম চলছে। পাথ বিভাজক হিসাবে ফরোয়ার্ড স্ল্যাশ সহ এটি কোনও ইউআরআই স্বীকৃতি দেবে এমন কোনও গ্যারান্টি নেই।
অ্যাড্রিয়ান বেকার

2
ক্যোয়ারী প্যারামগুলির সাথে ইউআরআই সম্পর্কে কী? কোনও ফাইল সিস্টেমের পথ হিসাবে একটি এলোমেলো ইউআরআইয়ের চিকিত্সা একটি ব্যতিক্রম চাচ্ছে।
অভিজিৎ সরকার

9

অ্যান্ড্রয়েডে

অ্যান্ড্রয়েডের ইউআরআই পরিচালনার জন্য একটি বিল্ট ইন ক্লাস রয়েছে।

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

কখনও কখনও এটি পুরো পথটি সরিয়ে দেয়। কেন বা কখন এলোমেলো মনে হচ্ছে তা নিশ্চিত নয়।
মোবদেব

আপনি যে সামগ্রীটি পার্সিং করছেন তা যদি আপনি তা ধরতে পারেন তবে নিশ্চিত হয়ে আপনি একটি ইউনিট পরীক্ষা সেট আপ করতে পারেন।
ব্রিল প্যাপিন

8

জাভা 7+ তে পূর্বের কয়েকটি উত্তরকে একত্রিত করা যেতে পারে কেবল শেষ বিভাগটির চেয়ে কোনও ইউআরআই থেকে কোনও পাথ বিভাগকে পুনরুদ্ধার করার অনুমতি দিতে । java.nio.file.Pathএর getName(int)পদ্ধতির সুবিধা নিতে আমরা কোনও আইআরআইকে রূপান্তর করতে পারি ।

দুর্ভাগ্যক্রমে, স্থিতিশীল কারখানাটি Paths.get(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()ফাংশন ব্যবহার করতে পারেন । ( অ্যান্ড্রয়েড ডকুমেন্টেশন )

আপনার উদাহরণ ইউআরআই বিবেচনা করুন:

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

ইউআরআই থেকে ইউআরএল পান এবং আপনি ফাইল উত্তোলনের সাবস্ট্রিং উপায় ব্যবহার করতে প্রস্তুত না হলে getFile () ব্যবহার করুন।


2
কাজ করবে না, getFile () এর জাভাদোক দেখুন: এই URL টির ফাইলের নাম পাওয়া যায়। প্রত্যাবর্তিত ফাইল অংশটি getPath (), এবং getQuery () এর মান সংক্ষিপ্তকরণের সমান হবে if যদি কোনও প্রশ্নের অংশ না থাকে তবে এই পদ্ধতি এবং getPath () অভিন্ন ফলাফল প্রদান করবে
will

ব্যবহার করবেন getPath()না getFile()
জেসন সি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.