আমি একটি স্ট্রিংয়ের সি # তে কেবল একটি স্পেস দিয়ে একাধিক স্পেস কীভাবে প্রতিস্থাপন করতে পারি?
উদাহরণ:
1 2 3 4 5
হবে:
1 2 3 4 5
আমি একটি স্ট্রিংয়ের সি # তে কেবল একটি স্পেস দিয়ে একাধিক স্পেস কীভাবে প্রতিস্থাপন করতে পারি?
উদাহরণ:
1 2 3 4 5
হবে:
1 2 3 4 5
উত্তর:
string sentence = "This is a sentence with multiple spaces";
RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);
sentence = regex.Replace(sentence, " ");
আমি ব্যবহার করতে চাই:
myString = Regex.Replace(myString, @"\s+", " ");
যেহেতু এটি কোনও ধরণের শ্বেত স্পেসের (যেমন ট্যাবগুলি, নিউলাইনগুলি, ইত্যাদি) ধরবে এবং তাদের একক স্থানের সাথে প্রতিস্থাপন করবে।
string xyz = "1 2 3 4 5";
xyz = string.Join( " ", xyz.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries ));
আমি মনে করি ম্যাট এর উত্তর সবচেয়ে ভাল, কিন্তু আমি বিশ্বাস করি না এটি একেবারে সঠিক। আপনি যদি নতুনলাইনগুলি প্রতিস্থাপন করতে চান তবে আপনাকে অবশ্যই ব্যবহার করতে হবে:
myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline);
এটি সর্বোপরি সহজ:
while(str.Contains(" ")) str = str.Replace(" ", " ");
Replace()
পদ্ধতি একটি প্রদত্ত স্ট্রিং দুই জায়গার সব ঘটনার হ্যান্ডেল হবে, তাই আমরা কি লুপিং করছি (এবং পুরো স্ট্রিং পুনরায় বণ্টন) স্ট্রিং জোড়া স্পেস প্রতিটি উদাহরণের জন্য। একটি নতুন বরাদ্দ এগুলি সব পরিচালনা করবে। আমরা যখন কেবল 3 বা ততোধিক স্পেস একসাথে থাকতাম তখন আমরা লুপটি আবার চালিত করি যা অনেক ইনপুট উত্সের ক্ষেত্রে বিরল ঘটনা হতে পারে। যদি আপনি এটি আপনার ডেটাতে সমস্যা হয়ে দেখাতে পারেন, তবে অক্ষর অনুসারে একটি নতুন স্ট্রিংবিল্ডারে অক্ষর ঠেকাতে স্টেট মেশিনটি লিখুন।
রেগেক্স সহজ কাজ এমনকি ধীর হতে পারে। এটি এমন একটি এক্সটেনশন পদ্ধতি তৈরি করে যা যে কোনওটিরও বাইরে ব্যবহার করা যায় string
।
public static class StringExtension
{
public static String ReduceWhitespace(this String value)
{
var newString = new StringBuilder();
bool previousIsWhitespace = false;
for (int i = 0; i < value.Length; i++)
{
if (Char.IsWhiteSpace(value[i]))
{
if (previousIsWhitespace)
{
continue;
}
previousIsWhitespace = true;
}
else
{
previousIsWhitespace = false;
}
newString.Append(value[i]);
}
return newString.ToString();
}
}
এটি যেমন ব্যবহার করা হবে:
string testValue = "This contains too much whitespace."
testValue = testValue.ReduceWhitespace();
// testValue = "This contains too much whitespace."
myString = Regex.Replace(myString, " {2,}", " ");
যারা পছন্দ করেন না তাদের জন্য Regex
এখানে একটি পদ্ধতি যা ব্যবহার করে StringBuilder
:
public static string FilterWhiteSpaces(string input)
{
if (input == null)
return string.Empty;
StringBuilder stringBuilder = new StringBuilder(input.Length);
for (int i = 0; i < input.Length; i++)
{
char c = input[i];
if (i == 0 || c != ' ' || (c == ' ' && input[i - 1] != ' '))
stringBuilder.Append(c);
}
return stringBuilder.ToString();
}
আমার পরীক্ষায়, স্ট্যাটিক সংকলিত রেজেক্সের তুলনায় এই পদ্ধতিটি ছোট থেকে মাঝারি আকারের স্ট্রিংগুলির একটি খুব বড় সেট সহ গড়ে 16 গুণ দ্রুত ছিল। একটি সং-সংহিত বা অ-স্ট্যাটিক রেজেক্সের তুলনায়, এটি আরও দ্রুত হওয়া উচিত।
মনে রাখবেন, এটি নেতৃস্থানীয় বা পিছনের স্থানগুলি সরিয়ে দেয় না , কেবল এরকম একাধিক ঘটনা।
আপনি কেবল এক লাইনের সমাধানে এটি করতে পারেন!
string s = "welcome to london";
s.Replace(" ", "()").Replace(")(", "").Replace("()", " ");
আপনি চাইলে অন্যান্য বন্ধনী (বা এমনকি অন্যান্য অক্ষর) চয়ন করতে পারেন।
"wel()come to london)("
হয়ে "wel come to london"
। আপনি বন্ধনী প্রচুর ব্যবহার চেষ্টা করে দেখতে পারেন। তাই ব্যবহার ((((()))))
পরিবর্তে ()
এবং )))))(((((
পরিবর্তে )(
। এটি হবে এখনও হবে। এখনও, যদি স্ট্রিংটিতে রয়েছে ((((()))))
বা )))))(((((
, এটি ব্যর্থ হবে
এটি একটি সংক্ষিপ্ত সংস্করণ, যা কেবলমাত্র এটি একবার ব্যবহার করলেই ব্যবহার করা উচিত, কারণ এটি Regex
প্রতিবার যখন ক্লাসে ডাকা হয় তখনই এটির একটি নতুন উদাহরণ তৈরি করে।
temp = new Regex(" {2,}").Replace(temp, " ");
আপনি যদি নিয়মিত প্রকাশের সাথে খুব বেশি পরিচিত না হন তবে এখানে একটি সংক্ষিপ্ত ব্যাখ্যা দেওয়া হল:
{2,}
চরিত্র এটা পূর্ববর্তী জন্য Regex অনুসন্ধান তোলে, এবং 2 এবং সীমাহীন বার মধ্যে, সাবস্ট্রিং খুঁজে বের করে। একটি স্পেস দিয়ে স্ট্রিং টেম্প সব মিল প্রতিস্থাপন।.Replace(temp, " ")
আপনি যদি এই একাধিকবার ব্যবহার করতে চান তবে এখানে আরও ভাল বিকল্প রয়েছে, কারণ এটি সংকলনের সময় রেজেক্স আইএল তৈরি করে:
Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled);
temp = singleSpacify.Replace(temp, " ");
কোনও রেজেক্স নেই, লিনক নেই ... শীর্ষস্থানীয় এবং পিছনের স্থানগুলি সরানোর পাশাপাশি কোনও এম্বেডড একাধিক স্পেস বিভাগকে এক জায়গায় হ্রাস করার পাশাপাশি
string myString = " 0 1 2 3 4 5 ";
myString = string.Join(" ", myString.Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries));
ফলাফল: "0 1 2 3 4 5"
জোয়েল অনুসারে অন্যান্য উত্তরগুলি একীভূত করছে এবং আশা করছি আমার যাওয়ার সাথে সাথে কিছুটা উন্নতি হবে:
আপনি এটি দিয়ে এটি করতে পারেন Regex.Replace()
:
string s = Regex.Replace (
" 1 2 4 5",
@"[ ]{2,}",
" "
);
বা সাথে String.Split()
:
static class StringExtensions
{
public static string Join(this IList<string> value, string separator)
{
return string.Join(separator, value.ToArray());
}
}
//...
string s = " 1 2 4 5".Split (
" ".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries
).Join (" ");
আমি কেবল Join
আমার পছন্দ মতো একটি নতুন লিখেছি , তাই আমি ভেবেছিলাম এটি দিয়ে আমি পুনরায় উত্তর দেব:
public static string Join<T>(this IEnumerable<T> source, string separator)
{
return string.Join(separator, source.Select(e => e.ToString()).ToArray());
}
এটি সম্পর্কে দুর্দান্ত জিনিসগুলির মধ্যে একটি হ'ল এটি উপাদানগুলিতে টসস্ট্রিং () কল করে স্ট্রিং নয় এমন সংগ্রহগুলির সাথে কাজ করে। ব্যবহার এখনও একইরকম:
//...
string s = " 1 2 4 5".Split (
" ".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries
).Join (" ");
// Mysample string
string str ="hi you are a demo";
//Split the words based on white sapce
var demo= str .Split(' ').Where(s => !string.IsNullOrWhiteSpace(s));
//Join the values back and add a single space in between
str = string.Join(" ", demo);
//output: string str ="hi you are a demo";
আমি জানি এটি বেশ পুরানো, তবে প্রায় একই জিনিসটি সম্পাদন করার চেষ্টা করার সময় এটি ছড়িয়ে পড়ে। রেজেক্সেক্স বাডিতে এই সমাধানটি খুঁজে পেয়েছি। এই প্যাটার্নটি একক স্পেসগুলির সাথে সমস্ত ডাবল স্পেস প্রতিস্থাপন করবে এবং শীর্ষস্থানীয় এবং অনুসরণযোগ্য স্থানগুলিও ছাঁটাই করবে।
pattern: (?m:^ +| +$|( ){2,})
replacement: $1
এটি খালি জায়গাগুলি নিয়ে কাজ করার পরে এটি পড়া একটু কঠিন, তাই এখানে এটি আবার "স্পেস" দিয়ে "_" দিয়ে প্রতিস্থাপন করা হয়েছে।
pattern: (?m:^_+|_+$|(_){2,}) <-- don't use this, just for illustration.
"(? মি:" কনস্ট্রাক্ট "মাল্টি-লাইন" বিকল্পটি সক্ষম করে generally
অনেক উত্তর সঠিক আউটপুট সরবরাহ করছে তবে যারা সেরা পারফরম্যান্সের সন্ধান করছেন তাদের জন্য আমি নোলনার উত্তর (যা পারফরম্যান্সের জন্য সেরা উত্তর ছিল) প্রায় 10% দ্বারা উন্নত করেছি ।
public static string MergeSpaces(this string str)
{
if (str == null)
{
return null;
}
else
{
StringBuilder stringBuilder = new StringBuilder(str.Length);
int i = 0;
foreach (char c in str)
{
if (c != ' ' || i == 0 || str[i - 1] != ' ')
stringBuilder.Append(c);
i++;
}
return stringBuilder.ToString();
}
}
আমি এটি দিয়ে হোয়াইটস্পেসগুলি সরাতে পারি
while word.contains(" ") //double space
word = word.Replace(" "," "); //replace double space by single space.
word = word.trim(); //to remove single whitespces from start & end.
এই পদ্ধতি চেষ্টা করুন
private string removeNestedWhitespaces(char[] st)
{
StringBuilder sb = new StringBuilder();
int indx = 0, length = st.Length;
while (indx < length)
{
sb.Append(st[indx]);
indx++;
while (indx < length && st[indx] == ' ')
indx++;
if(sb.Length > 1 && sb[0] != ' ')
sb.Append(' ');
}
return sb.ToString();
}
এটি এর মতো ব্যবহার করুন:
string test = removeNestedWhitespaces("1 2 3 4 5".toCharArray());
এখানে একটি হল সামান্য পরিমার্জন উপর Nolonar মূল উত্তর ।
চরিত্রটি কেবল একটি স্থান নয়, তবে কোনও সাদা জায়গা রয়েছে কিনা তা পরীক্ষা করে দেখুন:
এটি কোনও একক স্থানের সাথে কোনও একাধিক সাদা স্থানের অক্ষরকে প্রতিস্থাপন করবে।
public static string FilterWhiteSpaces(string input)
{
if (input == null)
return string.Empty;
var stringBuilder = new StringBuilder(input.Length);
for (int i = 0; i < input.Length; i++)
{
char c = input[i];
if (i == 0 || !char.IsWhiteSpace(c) || (char.IsWhiteSpace(c) &&
!char.IsWhiteSpace(strValue[i - 1])))
stringBuilder.Append(c);
}
return stringBuilder.ToString();
}
পুরানো skool:
string oldText = " 1 2 3 4 5 ";
string newText = oldText
.Replace(" ", " " + (char)22 )
.Replace( (char)22 + " ", "" )
.Replace( (char)22 + "", "" );
Assert.That( newText, Is.EqualTo( " 1 2 3 4 5 " ) );
স্ট্রিংবিল্ডার এবং এনিউরেবলের মিশ্রণ। স্ট্রিংগুলির জন্য এক্সটেনশন পদ্ধতি হিসাবে সমষ্টি () :
using System;
using System.Linq;
using System.Text;
public static class StringExtension
{
public static string StripSpaces(this string s)
{
return s.Aggregate(new StringBuilder(), (acc, c) =>
{
if (c != ' ' || acc.Length > 0 && acc[acc.Length-1] != ' ')
acc.Append(c);
return acc;
}).ToString();
}
public static void Main()
{
Console.WriteLine("\"" + StringExtension.StripSpaces("1 Hello World 2 ") + "\"");
}
}
ইনপুট:
"1 Hello World 2 "
আউটপুট:
"1 Hello World 2 "