ডিলিমিটার হিসাবে বিন্দুর সাথে স্ট্রিট বিভক্ত করুন


99

আমি ভাবছি যদি আমি একটি .সঠিক পথে একটি স্ট্রিং বিভক্ত সম্পর্কে যাচ্ছি ? আমার কোডটি হ'ল:

String[] fn = filename.split(".");
return fn[0];

আমার কেবল স্ট্রিংয়ের প্রথম অংশটি প্রয়োজন, এজন্য আমি প্রথম আইটেমটি ফিরিয়ে দিই। আমি জিজ্ঞাসা করি কারণ আমি এপিআইতে লক্ষ্য করেছি যার .অর্থ কোনও চরিত্র, তাই এখন আমি আটকে আছি।

উত্তর:


173

split()একটি নিয়মিত অভিব্যক্তি গ্রহণ করে, তাই আপনাকে .এটিকে একটি রেজেক্স মেটা চরিত্র হিসাবে বিবেচনা না করার জন্য পালাতে হবে। এখানে একটি উদাহরণ:

String[] fn = filename.split("\\."); 
return fn[0];

17

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

String[] fn = filename.split("\\.");

(একটি 'নিয়মিত অভিব্যক্তিতে'। 'রক্ষা পাওয়ার জন্য এবং অন্যটি জাভা স্ট্রিংয়ের প্রথমটি থেকে বাঁচার জন্য)

এছাড়াও আমি fn [0] ফিরিয়ে দেওয়ার পরামর্শ দিচ্ছি না কারণ আপনার কাছে যদি কোনও ফাইল নামকরণ করা থাকে something.blabla.txtযা একটি বৈধ নাম যা আপনি প্রকৃত ফাইলের নামটি ফিরিয়ে আনবেন না । পরিবর্তে আমি মনে করি আপনি এটি ব্যবহার করা ভাল:

int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);

প্রশ্নটি জাভা ট্যাগ করেছে, জাভাস্ক্রিপ্ট নয়, যা আপনি লিঙ্ক করেছেন।
আন্দ্রে ফিয়ারবিন্টানু

17

আমি এখানে কেবলমাত্র সমাধান দেখতে পাচ্ছি তবে সমস্যার পুরো ব্যাখ্যা নেই তাই আমি এই উত্তরটি পোস্ট করার সিদ্ধান্ত নিয়েছি

সমস্যা

আপনার সম্পর্কে কয়েকটি জিনিস জানা দরকার text.split(delim)splitপদ্ধতি:

  1. আর্গুমেন্ট রেগুলার এক্সপ্রেশন (রেজেক্স) হিসাবে গ্রহণ করে যা ডিলিমিটারকে বর্ণনা করে যার উপর আমরা বিভক্ত হতে চাই,
  2. যদি delimশেষে বিদ্যমান textমত a,b,c,,(যেখানে বিভেদক হয় ,) splitপ্রথম মত বিন্যাস তৈরি করবে এ ["a" "b" "c" "" ""]কিন্তু যেহেতু বেশিরভাগ ক্ষেত্রেই আমরা সত্যিই এই trailing খালি স্ট্রিং এটি আমাদের জন্য স্বয়ংক্রিয়ভাবে সরিয়ে ফেলা হবে প্রয়োজন হবে না। সুতরাং এটি খালি স্ট্রিংগুলি অনুসরণ না করে অন্য অ্যারে তৈরি করে এবং এটি ফেরত দেয়

এছাড়াও আপনি জানাতে চাই যে প্রয়োজন ডট. হয় বিশেষ অক্ষর মধ্যে Regex । এটি যে কোনও অক্ষরকে উপস্থাপন করে (লাইন বিভাজক বাদে তবে Pattern.DOTALLপতাকা দিয়ে এটি পরিবর্তন করা যেতে পারে )।

স্ট্রিং জন্য সুতরাং "abc"আমরা "." splitপদ্ধতি বিভক্ত যদি

  1. অ্যারে তৈরি করুন ["" "" "" ""],
  2. তবে যেহেতু এই অ্যারেটিতে কেবল খালি স্ট্রিং রয়েছে এবং সেগুলি সব পেছনে রয়েছে সেগুলি মুছে ফেলা হবে (যেমন আগের দ্বিতীয় পয়েন্টে দেখানো হয়েছে)

যার অর্থ আমরা ফলাফল খালি অ্যারে হিসাবে পাব [](কোনও উপাদান ছাড়াই খালি স্ট্রিংও নয়), তাই আমরা ব্যবহার করতে পারছি না fn[0]কারণ 0 সূচি নেই।

সমাধান

এই সমস্যাটি সমাধান করার জন্য আপনাকে কেবল রেজেেক্স তৈরি করতে হবে যা ডটকে উপস্থাপন করবে। এটি করতে আমাদের এড়াতে হবে .। এটি করার কয়েকটি উপায় রয়েছে তবে সহজতমটি সম্ভবত এটি ব্যবহার করে হয় \(যা স্ট্রিংয়ে লেখার প্রয়োজন "\\"কারণ \এটি সেখানে বিশেষ এবং এড়াতে অন্য আরেকটি প্রয়োজন \)।

সুতরাং আপনার সমস্যার সমাধান দেখতে ভাল লাগতে পারে

String[] fn = filename.split("\\.");

বোনাস

আপনি যে বিন্দু মত পলায়ন অন্যান্য উপায় ব্যবহার করতে পারেন

  • চরিত্র বর্গ ব্যবহার split("[.]")
  • উদ্ধৃতি এটি মোড়ানো split("\\Q.\\E")
  • Pattern.LITERALপতাকা সহ সঠিক প্যাটার্ন উদাহরণ ব্যবহার করে
  • বা কেবল ব্যবহার করুন split(Pattern.quote("."))এবং আপনার জন্য রেগেক্সকে পালাতে দিন।

এটি .. আমি সত্যিই এটি পছন্দ করি: split("[.]")
ড্রাগনজর্ন

15

স্ট্রিং # বিভক্ত (স্ট্রিং) পদ্ধতিতে নিয়মিত প্রকাশ হয়। নিয়মিত প্রকাশে, ""। চরিত্রের অর্থ "যে কোনও চরিত্র"। আপনি "এড়িয়ে চলার মাধ্যমে" এই আচরণটি এড়াতে পারবেন।

filename.split("\\.");

বা বিভক্ত পদ্ধতিটি একটি অক্ষর শ্রেণিতে বিভক্ত করতে বলছি:

filename.split("[.]");

চরিত্রের ক্লাসগুলি হ'ল অক্ষরের সংগ্রহ। আপনি লিখতে পারে

filename.split("[-.;ld7]");

এবং ফাইলের নাম প্রতিটি "-", "।", ";", "এল", "ডি" বা "7" এ বিভক্ত হবে। অক্ষর শ্রেণীর ভিতরে, "" কোনও বিশেষ চরিত্র নয় ("metacharacter")।


@ মিস্টারস্মিথ আপনি এখানে প্রোগ্রামিং ভাষাটি একবার দেখতে চান। আমরা জাভা সম্পর্কে কথা বলছি, জাভাস্ক্রিপ্ট নয়।
f1sh

তুমি একদম সঠিক. আমি গতকাল ক্লান্ত হয়ে পড়েছিলাম, উভয় ভাষায় কোডিং করছিলাম, জাভা ডেটাটাইপগুলি লক্ষ্য করলাম না। আমি ভেবেছিলাম সম্ভবত ২০১০ সালে উত্তরগুলি সঠিক ছিল তবে আজ কোনওভাবে ব্রাউজারগুলি অন্যরকম আচরণ করেছে।
মিস্টার স্মিথ

7

যেহেতু ডট (।) স্ট্রিংয়ের একটি বিশেষ চরিত্র এবং বিভাজন পদ্ধতি হিসাবে বিবেচিত হয় আপনি এটির মতো নিয়মিত ভাব প্রকাশের প্রত্যাশা করেন -

String[] fn = filename.split("\\.");
return fn[0];

জাভাতে বিশেষ অক্ষরগুলিকে "\" দিয়ে পালাতে হবে তবে যেহেতু "\" জাভাতেও একটি বিশেষ চরিত্র, তাই আপনাকে আবার অন্য "\" দিয়ে পালাতে হবে!



2

এটি ব্যবহার করা আরও দক্ষ হবে না

 filename.substring(0, filename.indexOf("."))

যদি আপনি কেবল প্রথম বিন্দুতে কি চান?


2

সাধারণত এটি নিজের হাতে খালি করা ভাল ধারণা নয়। এই কাজের জন্য প্যাটার্ন ক্লাসে একটি পদ্ধতি রয়েছে:

java.util.regex
static String quote(String s) 

1

বিভাজকটি অবশ্যই একটি আর্গুমেন্ট হিসাবে রেজেক্স গ্রহণ করছে ... কেবলমাত্র এতে পরিবর্তন "."করুন"\\."


0

দ্রষ্টব্য: বিন্দুটি পালানোর পরেও এই স্নিপেটের সাথে আরও যত্ন নেওয়া উচিত!

যদি ফাইলের নামটি কেবল স্ট্রিং থাকে "।", তবে fn এখনও 0 দৈর্ঘ্যের হবে এবং fn [0] এখনও একটি ব্যতিক্রম ছুঁড়ে ফেলবে!

এটি কারণ, যদি প্যাটার্নটি কমপক্ষে একবারের সাথে মেলে, তবে বিভাজকটি অ্যারে থেকে সমস্ত ট্রেলিং খালি স্ট্রিংগুলি (এই জাতীয় বিন্দুর আগেও ফেলে দেবে!) খালি অ্যারেটি ফিরে আসবে।


হাতের মতো ক্ষেত্রে সবচেয়ে সহজ সমাধান হ'ল বিভাজনের জন্য কলটির 2-এর একটি সীমা-যুক্তিও পাস করা: স্ট্রিং [] fn = filename.split ("[।]", 2);
avl42


0

অ্যাপাচিকমন্স ব্যবহার করা এটি সবচেয়ে সহজ:

File file = ...
FilenameUtils.getBaseName(file.getName());

দ্রষ্টব্য, এটি পুরো পথ থেকে একটি ফাইলের নামও বের করে।


-2

splitআর্গুমেন্ট হিসাবে একটি রেজেক্স লাগে। সুতরাং আপনার "\."পরিবর্তে উত্তীর্ণ হওয়া উচিত "."কারণ "."রেজেজেমে একটি মেটাচার্যাক্টর।

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