मैं C # में केवल एक स्थान के साथ एक स्ट्रिंग में कई रिक्त स्थान कैसे बदल सकता हूं?
उदाहरण:
1 2 3 4 5
होने वाला:
1 2 3 4 5
मैं C # में केवल एक स्थान के साथ एक स्ट्रिंग में कई रिक्त स्थान कैसे बदल सकता हूं?
उदाहरण:
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 या अधिक रिक्त स्थान थे, जो कि कई इनपुट स्रोतों के लिए दुर्लभ घटना होने की संभावना है। यदि आप दिखा सकते हैं कि यह आपके डेटा के लिए एक समस्या बन गया है, तो चरित्र को एक नए स्ट्रिंगर में चरित्र को आगे बढ़ाने के लिए राज्य मशीन पर जाएं।
Regex को सरल कार्यों के साथ भी धीमा किया जा सकता है। यह एक विस्तार विधि बनाता है जिसे किसी भी उपयोग किया जा सकता है 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,}
पहले से मौजूद चरित्र के लिए रेगेक्स खोज करता है, और 2 और असीमित समय के बीच सबस्ट्रिंग पाता है। .Replace(temp, " ")
एक स्थान के साथ स्ट्रिंग अस्थायी में सभी मैचों बदल देता है।
यदि आप इसे कई बार उपयोग करना चाहते हैं, तो यहां एक बेहतर विकल्प है, क्योंकि यह संकलन समय पर regex IL बनाता है:
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";
मुझे पता है कि यह बहुत पुराना है, लेकिन लगभग एक ही चीज को पूरा करने की कोशिश करते हुए इस पार भाग गया। RegEx बडी में यह समाधान मिला। यह पैटर्न सभी डबल स्पेस को सिंगल स्पेस से बदल देगा और लीडिंग और ट्रेलिंग स्पेस को भी ट्रिम कर देगा।
pattern: (?m:^ +| +$|( ){2,})
replacement: $1
खाली स्थान के साथ काम करने के बाद से इसे पढ़ना थोड़ा कठिन है, इसलिए यहाँ फिर से "रिक्त स्थान" के साथ एक "_" जगह है।
pattern: (?m:^_+|_+$|(_){2,}) <-- don't use this, just for illustration.
"(? M:") निर्माण "मल्टी-लाइन" विकल्प को सक्षम करता है। मैं आम तौर पर पैटर्न के भीतर जो भी विकल्प कर सकता हूं उसे शामिल करना पसंद करता हूं इसलिए यह अधिक आत्म निहित है।
कई उत्तर सही आउटपुट प्रदान कर रहे हैं, लेकिन सर्वश्रेष्ठ प्रदर्शन की तलाश करने वालों के लिए, मैंने नोलनार के उत्तर (जो प्रदर्शन के लिए सबसे अच्छा उत्तर था) में लगभग 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();
}
पुराना विद्यालय:
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 "