স্ট্রিং.স্প্লিট ক্রিয়াকলাপে হোয়াইটস্পেস নির্দিষ্ট করার সেরা উপায়


243

আমি হোয়াইটস্পেসের উপর ভিত্তি করে একটি স্ট্রিং বিভক্ত করছি:

string myStr = "The quick brown fox jumps over the lazy dog";

char[] whitespace = new char[] { ' ', '\t' };
string[] ssizes = myStr.Split(whitespace);

আমি এই কোডটি করতে চাইতে কোডের সর্বত্র [] অ্যারের সংজ্ঞা দেওয়া অদ্ভুত। আরও কার্যকর উপায় আছে যার জন্য অ্যারে অক্ষর তৈরির প্রয়োজন নেই (যা বিভিন্ন স্থানে অনুলিপিযুক্ত থাকলে ত্রুটির প্রবণতা রয়েছে)?


1
এটি করে: myStr.Split (''); কাজ করে না?
উওলাগারু

4
যদি আমি এটি সঠিকভাবে বুঝতে পারি তবে এটি কেবল কোনও জায়গার জন্য অনুসন্ধান করবে, জেনেরিক সাদা জায়গা নয়

সম্ভাব্য সদৃশটিও দেখুন তবে এই উত্তরগুলির স্প্লিটস্ট্রিংঅপশন রয়েছে। stackoverflow.com/questions/1562981/...
goodeye

উত্তর:


469

আপনি যদি কেবল কল করেন:

string[] ssize = myStr.Split(null);

বা:

string[] ssize = myStr.Split(new char[0]);

তারপরে সাদা-স্থানটিকে বিভাজনকারী চরিত্র হিসাবে ধরে নেওয়া হয়। থেকে string.Split(char[])পদ্ধতি এর ডকুমেন্টেশন পৃষ্ঠাটিতে

বিভাজক পরামিতি হয় null বা কোনও অক্ষর না থাকে তবে সাদা-স্পেস অক্ষরগুলি সীমানা হিসাবে ধরে নেওয়া হয়। হোয়াইট-স্পেস অক্ষরগুলি ইউনিকোড স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত করা হয় এবং trueযদি সেগুলি Char.IsWhiteSpaceপদ্ধতিতে পাস করা হয় তবে ফিরে আসুন।

সর্বদা, সর্বদা, সর্বদা ডকুমেন্টেশন পড়ুন!


2
হোয়াইটস্পেসের মাধ্যমে বিভক্ত হওয়ার সমস্যাটি যদি আপনাকে আবার একসাথে রাখতে হয় তবে আপনি জানেন না যে কোন সাদা বাক্সে অক্ষরটি পিছনে রাখা উচিত।
রস প্রেসার

19
(char[])nullএটি কিছুটা ভাল কারণ এটি একটি নতুন অবজেক্ট তৈরি করা এড়িয়ে চলে। (আপনি nullকোনও optionsওভারলোডের সাথে ব্যবহার করতে পারবেন না )।
আর্টফুঙ্কেল

5
@ রোসপ্রেসার: স্ট্রিংকে একসাথে রেখে দেওয়া সম্পূর্ণ ভিন্ন সমস্যা, তাই আমি এখানে বলব না যে এটি এখানে একটি সমস্যা। তবে আপনাকে যা করার দরকার তা যদি স্ট্রিংটি ঠিক আগের মতো করে রাখা হয় তবে সম্ভবত আরও ভাল রাখুন।
stakx -

4
বোকা প্রশ্ন, তবে আপনি যদি ব্যবহার করেন তবে nullআপনার কি এখনও নির্দিষ্ট করার দরকার আছে StringSplitOption.RemoveEmptyEntriesবা সেগুলি ডিফল্টরূপে উপেক্ষা করা হচ্ছে?
yu_ominae

2
@ রসপ্রেসার: যেহেতু স্ট্রিং.স্প্লিট স্ট্রিংকে বিভক্ত করার জন্য ব্যবহৃত অক্ষরগুলি ট্র্যাক করার জন্য কোনও ব্যবস্থা সরবরাহ করে না, তাই আপনার পর্যবেক্ষণ প্রাসঙ্গিক নয়: স্ট্রিং.স্প্লিট ব্যবহার করে আপনি যা অর্জন করতে পারেন তা কেউ অর্জন করতে পারে না, সুতরাং এর জন্য আলাদা প্রশ্নোত্তর প্রয়োজন।
টুলমেকারস্টেভ

207

হ্যাঁ, এখানে আরও একটি উত্তর প্রয়োজন!

সমস্ত সমাধান এখন পর্যন্ত ক্যানোনিকাল ইনপুটটির বরং সীমাবদ্ধ ডোমেনটিকেই সম্বোধন করে: উপাদানগুলির মধ্যে একটি একক শ্বেত স্পেস অক্ষর (যদিও সমস্যাটি অন্তত উল্লেখ করার জন্য @ চেরানোতে টুপিটির টিপ)। তবে আমি এগুলিকে সবচেয়ে অস্পষ্ট পরিস্থিতি ব্যতীত জমা দিয়েছি, এই সমস্তগুলিকে বিভক্ত করলে অভিন্ন ফলাফল পাওয়া উচিত :

string myStrA = "The quick brown fox jumps over the lazy dog";
string myStrB = "The  quick  brown  fox  jumps  over  the  lazy  dog";
string myStrC = "The quick brown fox      jumps over the lazy dog";
string myStrD = "   The quick brown fox jumps over the lazy dog";

String.Split(এখানে অন্যান্য উত্তর জুড়ে দেখানো স্বাদগুলির কোনওটিতে) আপনি যদি RemoveEmptyEntriesএইগুলির সাথে বিকল্পটি সংযুক্ত না করেন তবে কেবল ভাল কাজ করে না :

myStr.Split(new char[0], StringSplitOptions.RemoveEmptyEntries)
myStr.Split(new char[] {' ','\t'}, StringSplitOptions.RemoveEmptyEntries)

যেমন চিত্রটি প্রকাশ করে, বিকল্পটি বাদ দেওয়া থেকে চারটি ভিন্ন ফলাফল পাওয়া যায় (এ, বি, সি এবং ডি লেবেলযুক্ত বনাম) আপনি যখন ব্যবহার করবেন তখন চারটি ইনপুট থেকে একক ফলাফল RemoveEmptyEntries:

স্ট্রিং.স্প্লিট বনাম রেগেক্স.স্প্লিট

অবশ্যই, আপনি যদি বিকল্পগুলি ব্যবহার করতে পছন্দ না করেন তবে কেবলমাত্র রেজেক্স বিকল্পটি ব্যবহার করুন :-)

Regex.Split(myStr, @"\s+").Where(s => s != string.Empty)

4
আমি মনে করি, @ রোসপ্রেসার, এটি আমার কোয়ালিফায়ার দ্বারা "সবচেয়ে অস্পষ্ট পরিস্থিতি ব্যতীত" আবৃত। আমি একটি ক্যানোনিকাল ফর্ম চাই - প্রতিটি মধ্যে একটি জায়গা। সুতরাং আমি শ্রদ্ধার সাথে একমত নই - এটি "সাধারণত ভুল" না হয়ে "খুব কমই ভুল" হবে।
মাইকেল সোরেন্স 21

1
CapitalizeEveryWord("This is line one.\n \nThis is line three.")
রস প্রেসার

3
যদি আপনি সত্যিই ভাবেন যে এটি অস্পষ্ট, তবে আমি অনুমান করি আমাদের সাথে একমত হতে হবে না, তবে আমি যদি এই সফ্টওয়্যারটি বাদ দিয়ে আমার চাকরিটি হারাতে পারি। ব্যবহারকারীরা তাদের সামগ্রীটি দেখতে চান এমনভাবে দেখতে পছন্দ করেন to
রস প্রেসার

4
এটি একটি গ্রহণযোগ্য উত্তর হওয়া উচিত, যেহেতু এটি অনেক বেশি সম্পূর্ণ।
ডেনিস

1
আমি ভাবছি আপনি কেন .Where(s => s != string.Empty)রেজেক্সে যুক্ত করেছেন? যেহেতু আপনি নির্দিষ্ট করেছেন \s+(স্পেসের যে কোনও সংখ্যা) এর মধ্যে কোনও খালি আইটেম থাকতে পারে না।
জ্যাক মিলার

44

ডকুমেন্টেশন অনুযায়ী :

বিভাজক প্যারামিটারটি যদি নাল হয় বা কোনও অক্ষর না থাকে তবে সাদা-স্থানের অক্ষরগুলি সীমানার হিসাবে ধরে নেওয়া হয়। হোয়াইট-স্পেস অক্ষরগুলি ইউনিকোড স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত করা হয় এবং তারা যদি Char.IsWhiteSpace পদ্ধতিতে পাস করা হয় তবে সত্য হয়।

সুতরাং কেবল কল করুন myStr.Split();কোনও কিছুর মধ্যে পাস করার দরকার নেই কারণ বিভাজক একটি paramsঅ্যারে।


11

আপনি কেন ব্যবহার করবেন না ?:

string[] ssizes = myStr.Split(' ', '\t');

2
এখানে কোনও স্প্লিট ওভারলোড নেই যা দুটি চর নেয়।
টাকরল

1
@ টাকরল: এখানে পাবলিক স্ট্রিং দেখুন [] স্প্লিট (প্যারাম চর [] বিভাজক)। নেট ভি 2
রেনাতাস এম।

হ্যাঁ, এটি একটি অক্ষরের অ্যারে নেয়। আপনার কোড স্নিপেট দুটি একক অক্ষর পাস করে।
টাকরল

15
@takrl: আপনি জানেন কি প্যারাম শব্দ হয় ???
রেনাতাস এম।

খুব সুন্দর, তার জন্য +1। সম্ভবত যে ব্যক্তি হ্রাস পেয়েছে সেও জানত না।
টাকরল

3

নোট করুন যে সংলগ্ন সাদা স্থানটি ব্যবহার করার পরেও একক ডিলিমিটার হিসাবে বিবেচিত হবে না String.Split(null)। যদি আপনার কোনও টোকেন একাধিক স্পেস বা ট্যাবগুলির সাথে পৃথক করা হয়, আপনি খালি স্ট্রিংগুলি আপনার অ্যারেতে ফিরে পাবেন।

ডকুমেন্টেশন থেকে:

বিভাজকের প্রতিটি উপাদান একটি পৃথক ডিলিমিটার অক্ষর নির্ধারণ করে। যদি দুটি ডিলিমিটার সংলগ্ন হয়, বা এই উদাহরণের শুরুতে বা শেষে একটি ডিলিমিটার পাওয়া যায় তবে সংশ্লিষ্ট অ্যারে উপাদানটিতে খালি থাকে।


2

সুতরাং কপি এবং পেস্ট করবেন না! আপনার বিভাজন করতে একটি ফাংশন নিষ্ক্রিয় করুন এবং এটি পুনরায় ব্যবহার করুন।

public static string[] SplitWhitespace (string input)
{
    char[] whitespace = new char[] { ' ', '\t' };
    return input.Split(whitespace);
}

কোড পুনরায় ব্যবহার আপনার বন্ধু।


1

আপনি কেবল এটি করবেন না কেন:

var ssizes = myStr.Split(" \t".ToCharArray());

মনে হচ্ছে একটি পদ্ধতি আছে String.ToCharArray().NET 4.0 এ !

সম্পাদনা: ভিএমএটিএম যেমন উল্লেখ করেছে, পদ্ধতিটি ইতিমধ্যে। নেট 2.0 এ বিদ্যমান ছিল!


এই পদ্ধতিটি .NET 2.0 এ আছে! msdn.microsoft.com/en-us/library/ezftk57x(VS.80).aspx
VMAtm

1

তুমি ব্যবহার করতে পার

var ফার্স্টস্ট্রিং = আপনার স্ট্রিং.স্প্লিট ()। প্রথম ();

স্ট্রিং বিভক্ত।


0

আপনি কি ইনলাইন করতে পারবেন না?

var sizes = subject.Split(new char[] { ' ', '\t' });

অন্যথায়, আপনি যদি এই সঠিক জিনিসটি প্রায়শই করেন তবে আপনি সর্বদা ধ্রুবক বা সেই চর অ্যারে সম্বলিত কিছু তৈরি করতে পারেন।

অন্যরা যেমন উল্লেখ করেছে যে আপনি ডকুমেন্টেশন অনুযায়ী nullখালি অ্যারেও ব্যবহার করতে পারেন ray আপনি যখন এটি করেন এটি স্বয়ংক্রিয়ভাবে শ্বেতস্থান বর্ণচিহ্নগুলি ব্যবহার করবে।

var sizes = subject.Split(null);

0

যদি একই কোডটির পুনরাবৃত্তি করা সমস্যা হয় তবে স্ট্রিং ক্লাসে একটি এক্সটেনশান পদ্ধতি লিখুন যা বিভাজন যুক্তিকে encapsulates।


1
এটি সত্যই প্রশ্নের উত্তর দেয় না, দুঃখিত।
পি.কম্পবেল

পি। ক্যাম্পবেল: হ্যাঁ এটি করে: ওপি এমন একটি সমাধান চেয়েছিল যার জন্য চরিত্রের অ্যারেটি সর্বত্র অনুলিপি করার প্রয়োজন নেই। একটি সুস্পষ্ট সমাধান হ'ল কাজটি করার জন্য একটি ফাংশন তৈরি করা। এই উত্তরটি উল্লেখ করে যে এই জাতীয় ফাংশনটি কোনও এক্সটেনশন পদ্ধতি হতে পারে। (এর জন্য কোডটি দেখিয়ে উত্তরটি আরও উন্নত হতে পারে ...)
টুলমেকারস্টেভ

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