আমি সি # তে একক স্পেস দিয়ে একাধিক স্পেস কীভাবে প্রতিস্থাপন করব?


440

আমি একটি স্ট্রিংয়ের সি # তে কেবল একটি স্পেস দিয়ে একাধিক স্পেস কীভাবে প্রতিস্থাপন করতে পারি?

উদাহরণ:

1 2 3  4    5

হবে:

1 2 3 4 5

1
একটি রাষ্ট্রীয় মেশিনটি সহজেই এটি করতে পারে তবে কেবল স্থানগুলি অপসারণ করার জন্য আপনার যদি এটির প্রয়োজন হয় তবে সম্ভবত এটি ওভারকিল
অ্যাড্রিয়ান

আমি এটির একটি সদৃশ প্রশ্ন stackoverflow.com/a/37592018/582061 এ বিভিন্ন উপায়ে একটি মানদণ্ড যুক্ত করেছি । এটি করার দ্রুততম উপায় ছিল না রেজেক্স।
স্টিয়ান স্ট্যান্ডাহাল

উত্তর:


468
string sentence = "This is a sentence with multiple    spaces";
RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);     
sentence = regex.Replace(sentence, " ");

2
আমার এটি অনুলিপি এবং পেস্ট হয়েছে এবং এটি কার্যকর। আমি সত্যিই আরেগেক্স পছন্দ করি না তবে এবার এটি আমার জীবন বাঁচায়।
পোকাস

9
@ ক্রেইগ একটি মন্তব্য যথেষ্ট হবে, আইএমও। // এই ব্লকটি একের সাথে একাধিক স্পেস প্রতিস্থাপন করে ... :)
পলহুইট

6
সত্যিই, রেজিএক্স এটির জন্য ওভারকিল।
জোয়েল কোহোর্ন 15

11
@ জোয়েল: একমত হতে পারে না। আমি আসলে নিশ্চিত যে বড় স্ট্রিংয়ের জন্য এই উপায়টি আপনার চেয়ে বেশি দক্ষ এবং এটি একটি এক লাইনেও করা যেতে পারে। ওভারকিল কোথায়?
কনরাড রুডল্ফ

24
@ অস্কার জোয়েলের কোডটি সমস্ত অক্ষরের মধ্য দিয়ে কোনও সাধারণ লুপ নয়! এটি একটি লুকানো নেস্টেড লুপ যা চতুষ্কোণতম খারাপ ক্ষেত্রে রয়েছে। এই নিয়মিত অভিব্যক্তি, বিপরীতে, লিনিয়ার, কেবল একটি একক স্ট্রিং তৈরি করে (= জোয়েল এর কোডের তুলনায় বরাদ্দ ব্যয়কে তীব্রভাবে কমিয়ে দেয়) এবং তদুপরি ইঞ্জিন এটি থেকে নরকটিকে অনুকূল করতে পারে (সত্যি বলতে, আমি সন্দেহ করি। নেট রেজেক্স) এর জন্য যথেষ্ট স্মার্ট তবে তত্ত্ব অনুসারে এই নিয়মিত প্রকাশটি এত সস্তাভাবে প্রয়োগ করা যেতে পারে যে এটি আর মজারও নয়; এর জন্য কেবল তিনটি রাজ্যের একটি ডিএফএ প্রয়োজন, একটির একটি ট্রানজিশন এবং কোনও অতিরিক্ত তথ্য নেই)।
কনরাড রুডলফ

624

আমি ব্যবহার করতে চাই:

myString = Regex.Replace(myString, @"\s+", " ");

যেহেতু এটি কোনও ধরণের শ্বেত স্পেসের (যেমন ট্যাবগুলি, নিউলাইনগুলি, ইত্যাদি) ধরবে এবং তাদের একক স্থানের সাথে প্রতিস্থাপন করবে।


43
সামান্য পরিবর্তন: রিজেক্স। রিপ্লেস (উত্স, @ "() গুলি) \ s +", "$ 1"); এটি পাওয়া প্রথম হোয়াইটস্পেস প্রকারটি ফিরিয়ে দেবে। সুতরাং আপনার যদি 5 টি ট্যাব থাকে তবে এটি একটি ট্যাব ফিরিয়ে দেবে। যদি কেউ এটিকে পছন্দ করে।
এফবি দশ কেট

@radistao আপনার লিঙ্কটি জাভাস্ক্রিপ্ট স্ট্রিং প্রতিস্থাপনের জন্য, সি # এর জন্য নয়।
শিব

1
@ শিভা, / \ এস \ এস + / হ'ল একটি স্ট্যান্ডার্ড পসিক্স রেইগেক্স স্টেটমেন্ট এবং কোনও
বাক্যে

4
@ এফবেটেনকেটের সমাধানের চেতনায়: রেজেক্স.রেপ্লেস (উত্স, @ "() গুলি) \ 1+", "$ 1"); একক একের পর এক একাধিক অভিন্ন অক্ষর প্রতিস্থাপন করবে ।
ফ্রাসোয়া Beaune,

1
শীর্ষস্থানীয় এবং চলমান শ্বেত স্পেসগুলি অপসারণ করার জন্য আপনার এর সাথে ট্রিম () ফাংশনটি ব্যবহার করা উচিত, যেমন var myString = Regex.Replace (myString, @ "\ s +", "")। ট্রিম ();
হরিশ নায়ক

50
string xyz = "1   2   3   4   5";
xyz = string.Join( " ", xyz.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries ));

6
এটি রেগেক্সের চেয়ে আরও পঠনযোগ্য, আমি এটিকে আরও পছন্দ করি কারণ আমার অন্য কোনও বাক্য গঠন শেখার দরকার নেই
মাইকেল বাহিগ

9
আমি এটি পছন্দ করি কারণ এটির
রেজেক্সের

3
এটি বড় স্ট্রিংগুলির জন্য অকার্যকর হবে।
ডারসি থমাস

3
এটি নেতৃস্থানীয় এবং পিছনের স্থানগুলিও সরিয়ে দেয়।
মাতজি

1
আমি এই উত্তরটিও পছন্দ করি। আমার বয়সী পরামর্শদাতা বলতে "যে কোন সময় আপনি একটি সমস্যা আছে যদি আপনি মনে করেন সমাধান করতে Regex, ভাল প্রয়োজন ... এখন আপনি দুটি সমস্যা পেয়েছেন" ব্যবহৃত <নিমেষে>
উইলিয়াম ম্যাডোনা জুনিয়র

38

আমি মনে করি ম্যাট এর উত্তর সবচেয়ে ভাল, কিন্তু আমি বিশ্বাস করি না এটি একেবারে সঠিক। আপনি যদি নতুনলাইনগুলি প্রতিস্থাপন করতে চান তবে আপনাকে অবশ্যই ব্যবহার করতে হবে:

myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline);

4
RegexOptions. মাল্টিলাইন ^ এবং $ এর অর্থ পরিবর্তন করে তাই তারা পুরো মাল্টি-লাইনের স্ট্রিংয়ের পরিবর্তে প্রতিটি লাইনের ($ = \ n) শুরু এবং শেষের সাথে মেলে। কারণ \ গুলি [\ f \ n \ r \ t \ v] এর সমতুল্য মাল্টলাইন বিকল্পটি বন্ধ থাকলেও নতুন লাইনগুলি প্রতিস্থাপন করা উচিত।
সুশিগু

1
ম্যাট এর উত্তর ইতিমধ্যে এটি আবৃত। আমি 'বিশ্বাস করি' 30 জন এই উত্তরটি
চোখের পাতায় রেখেছেন

26

লিনকিউ ব্যবহার করে এমন আরেকটি পদ্ধতি:

 var list = str.Split(' ').Where(s => !string.IsNullOrWhiteSpace(s));
 str = string.Join(" ", list);

23

এটি সর্বোপরি সহজ:

while(str.Contains("  ")) str = str.Replace("  ", " ");

23
এটি স্ট্রিংয়ে 3 বা ততোধিক স্পেসের ক্রম থাকলে "রেগেক্স" {2,} "এর চেয়ে অনেক কম দক্ষ হবে।
জান গোয়েভার্টস

2
@ জাংগোয়েয়ার্টস: 10 টি স্পেস থাকা সত্ত্বেও, আমি যখন একটি দ্রুত এবং নোংরা পরীক্ষা নিরীক্ষা করছিলাম তখন রেজেক্সটি ধীর ছিল। বলা হচ্ছে, ততক্ষণ লুপটির কার্য সম্পাদন সম্পূর্ণরূপে খালি করতে কেবল একটি বিশাল স্থানের পূর্ণ স্ট্রিং লাগে। ন্যায্যতার জন্য, আমি ধীরে ধীরে রেজেক্সের পরিবর্তে রেগেক্সঅপশন ব্যবহার করেছি omp সংকলিত।
ব্রায়ান

5
RegexOptions.Compiled আইএল মধ্যে regex সংকলন প্রচুর ওভারহেড যোগ করে। আপনার অ্যাপ্লিকেশনটি প্রায়শই পর্যাপ্ত পরিমাণে বা বড় পরিমাণে স্ট্রিং ব্যবহার করে রেগেক্স ব্যবহার না করে এটি ব্যবহার করবেন না যে বর্ধিত মিলের গতি হ্রাস সংকলনের গতিকে অফসেট করে।
জান গোয়েভার্টস

এটি চরম অদক্ষ কোডের একটি উদাহরণ। হাঃ হাঃ হাঃ.
পিসিবাবু

1
@ পিসিবাবু এটি অনেকটা ক্ষেত্রেই খারাপ বলে মনে হয় না। Replace()পদ্ধতি একটি প্রদত্ত স্ট্রিং দুই জায়গার সব ঘটনার হ্যান্ডেল হবে, তাই আমরা কি লুপিং করছি (এবং পুরো স্ট্রিং পুনরায় বণ্টন) স্ট্রিং জোড়া স্পেস প্রতিটি উদাহরণের জন্য। একটি নতুন বরাদ্দ এগুলি সব পরিচালনা করবে। আমরা যখন কেবল 3 বা ততোধিক স্পেস একসাথে থাকতাম তখন আমরা লুপটি আবার চালিত করি যা অনেক ইনপুট উত্সের ক্ষেত্রে বিরল ঘটনা হতে পারে। যদি আপনি এটি আপনার ডেটাতে সমস্যা হয়ে দেখাতে পারেন, তবে অক্ষর অনুসারে একটি নতুন স্ট্রিংবিল্ডারে অক্ষর ঠেকাতে স্টেট মেশিনটি লিখুন।
জোয়েল কোহোর্ন

21

রেগেক্স সহজ কাজ এমনকি ধীর হতে পারে। এটি এমন একটি এক্সটেনশন পদ্ধতি তৈরি করে যা যে কোনওটিরও বাইরে ব্যবহার করা যায় 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."


11

যারা পছন্দ করেন না তাদের জন্য 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 গুণ দ্রুত ছিল। একটি সং-সংহিত বা অ-স্ট্যাটিক রেজেক্সের তুলনায়, এটি আরও দ্রুত হওয়া উচিত।

মনে রাখবেন, এটি নেতৃস্থানীয় বা পিছনের স্থানগুলি সরিয়ে দেয় না , কেবল এরকম একাধিক ঘটনা।


আপনি যদি পরীক্ষা করতে চান তবে চরিত্রটি শ্বেতক্ষেত্র কিনা, এবং কেবল কোনও স্থান নয় নীচে আমার উত্তরটি দেখুন
রীপ

8

আপনি কেবল এক লাইনের সমাধানে এটি করতে পারেন!

string s = "welcome to  london";
s.Replace(" ", "()").Replace(")(", "").Replace("()", " ");

আপনি চাইলে অন্যান্য বন্ধনী (বা এমনকি অন্যান্য অক্ষর) চয়ন করতে পারেন।


1
আপনি নিশ্চিত করুন যে আপনার স্ট্রিং নেই বা ") (" এটা করতে "()" আছে। নাকি "wel()come to london)("হয়ে "wel come to london"। আপনি বন্ধনী প্রচুর ব্যবহার চেষ্টা করে দেখতে পারেন। তাই ব্যবহার ((((()))))পরিবর্তে ()এবং )))))(((((পরিবর্তে )(। এটি হবে এখনও হবে। এখনও, যদি স্ট্রিংটিতে রয়েছে ((((()))))বা )))))(((((, এটি ব্যর্থ হবে
nmit026

7

এটি একটি সংক্ষিপ্ত সংস্করণ, যা কেবলমাত্র এটি একবার ব্যবহার করলেই ব্যবহার করা উচিত, কারণ এটি Regexপ্রতিবার যখন ক্লাসে ডাকা হয় তখনই এটির একটি নতুন উদাহরণ তৈরি করে।

temp = new Regex(" {2,}").Replace(temp, " "); 

আপনি যদি নিয়মিত প্রকাশের সাথে খুব বেশি পরিচিত না হন তবে এখানে একটি সংক্ষিপ্ত ব্যাখ্যা দেওয়া হল:

{2,}চরিত্র এটা পূর্ববর্তী জন্য Regex অনুসন্ধান তোলে, এবং 2 এবং সীমাহীন বার মধ্যে, সাবস্ট্রিং খুঁজে বের করে। একটি স্পেস দিয়ে স্ট্রিং টেম্প সব মিল প্রতিস্থাপন।
.Replace(temp, " ")

আপনি যদি এই একাধিকবার ব্যবহার করতে চান তবে এখানে আরও ভাল বিকল্প রয়েছে, কারণ এটি সংকলনের সময় রেজেক্স আইএল তৈরি করে:

Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled);
temp = singleSpacify.Replace(temp, " ");

7

কোনও রেজেক্স নেই, লিনক নেই ... শীর্ষস্থানীয় এবং পিছনের স্থানগুলি সরানোর পাশাপাশি কোনও এম্বেডড একাধিক স্পেস বিভাগকে এক জায়গায় হ্রাস করার পাশাপাশি

string myString = "   0 1 2  3   4               5  ";
myString = string.Join(" ", myString.Split(new char[] { ' ' }, 
StringSplitOptions.RemoveEmptyEntries));

ফলাফল: "0 1 2 3 4 5"


1
সাবধানতার একটি শব্দ: বিভক্তির ব্যবহার, সত্যই বোঝার জন্য খুব সহজ, আশ্চর্যজনকভাবে নেতিবাচক কর্মক্ষমতা প্রভাব ফেলতে পারে। অনেকগুলি স্ট্রিং তৈরি হতে পারে, আপনি যদি এই পদ্ধতির সাহায্যে বড় স্ট্রিং পরিচালনা করেন তবে আপনাকে আপনার মেমরির ব্যবহার দেখতে হবে।
প্যাক0

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 (" ");

3

আমি কেবল 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 (" ");

2
কেন একটি এক্সটেনশন পদ্ধতি তৈরি? শুধু স্ট্রিংই ব্যবহার করবেন না কেন?
এরিক শুনোভার

3
      // 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";

2

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

pattern: (?m:^ +| +$|( ){2,})
replacement: $1

এটি খালি জায়গাগুলি নিয়ে কাজ করার পরে এটি পড়া একটু কঠিন, তাই এখানে এটি আবার "স্পেস" দিয়ে "_" দিয়ে প্রতিস্থাপন করা হয়েছে।

pattern: (?m:^_+|_+$|(_){2,})  <-- don't use this, just for illustration.

"(? মি:" কনস্ট্রাক্ট "মাল্টি-লাইন" বিকল্পটি সক্ষম করে generally


2

অনেক উত্তর সঠিক আউটপুট সরবরাহ করছে তবে যারা সেরা পারফরম্যান্সের সন্ধান করছেন তাদের জন্য আমি নোলনার উত্তর (যা পারফরম্যান্সের জন্য সেরা উত্তর ছিল) প্রায় 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();
    }

}

1

আমি এটি দিয়ে হোয়াইটস্পেসগুলি সরাতে পারি

while word.contains("  ")  //double space
   word = word.Replace("  "," "); //replace double space by single space.
word = word.trim(); //to remove single whitespces from start & end.

হ্যাঁ তবে আপনি কেবল দুটিটির সাথে একটি সাদা জায়গা প্রতিস্থাপন করবেন। এটি এক্স নম্বর সংখ্যা
ফাঁকাতে

1
লুপটি যখন ডাবল স্পেসগুলি সরিয়ে ফেলা হবে তার সমস্ত যত্ন নেবে।
শিখুন 1947

1

রেজেক্স প্যাটার্নটি ব্যবহার করুন

    [ ]+    #only space

   var text = Regex.Replace(inputString, @"[ ]+", " ");

1

এই পদ্ধতি চেষ্টা করুন

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());

এটি চলমান স্থানগুলি সরিয়ে ফেলবে
The_Black_Smurf

ভুলের জন্য দুঃখিত, আমি কোডটি ঠিক করেছি, এখন এটি প্রত্যাশিত পরীক্ষিত স্ট্রিং হিসাবে কাজ করেছে: "1 2 3 4 9" ফলাফল স্ট্রিং: "1 2 3 4 9"
আহমেদ আলজাফ

1

এখানে একটি হল সামান্য পরিমার্জন উপর 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();
}

0

পুরানো 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 " ) );

0

নিয়মিত অভিব্যক্তি ব্যবহার না করে:

while (myString.IndexOf("  ", StringComparison.CurrentCulture) != -1)
{
    myString = myString.Replace("  ", " ");
}

সংক্ষিপ্ত স্ট্রিংগুলিতে ব্যবহার করা ঠিক আছে তবে প্রচুর স্পেস সহ দীর্ঘ স্ট্রিংগুলিতে খারাপভাবে সঞ্চালন করবে।


0

স্ট্রিংবিল্ডার এবং এনিউরেবলের মিশ্রণ। স্ট্রিংগুলির জন্য এক্সটেনশন পদ্ধতি হিসাবে সমষ্টি () :

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