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


108

ধরা যাক আমার মতো স্ট্রিং রয়েছে:

"Hello     how are   you           doing?"

আমি এমন একটি ফাংশন চাই যা একাধিক স্পেসকে একটি স্পেসে পরিণত করে।

সুতরাং আমি পেতে হবে:

"Hello how are you doing?"

আমি জানি আমি রেজেক্স বা কল ব্যবহার করতে পারি

string s = "Hello     how are   you           doing?".replace("  "," ");

তবে সমস্ত ক্রমবর্ধমান শ্বেতস্থান কেবল একটিতে প্রতিস্থাপিত হয়েছে তা নিশ্চিত করতে আমাকে একাধিকবার কল করতে হবে।

এর জন্য কি ইতিমধ্যে একটি অন্তর্নির্মিত পদ্ধতি রয়েছে?


আপনি কি পরিষ্কার করে বলতে পারেন: আপনি কি কেবল ফাঁকা জায়গাগুলি, বা "সমস্ত" সাদা স্থানের সাথে কাজ করছেন?
জন স্কিটে

এবং আপনি কি চান যে কোনও ফাঁকা স্থান ফাঁকা স্থানগুলিতে রূপান্তরিত হয়?
জন স্কিটে

আমি কেবল বুঝিয়েছি যে সিরিজের সমস্ত সাদা স্থানটি সর্বাধিক 1
ম্যাট


2 জিনিষ বিবেচনা করতে: 1. char.IsWhiteSpace ঘোড়ার গাড়ি রিটার্ন, অন্তর্ভুক্ত লাইনফীড ইত্যাদি 2. 'হোয়াইটস্পেস' সম্ভবত আরো নিখুঁতভাবে Char.GetUnicodeCategory (CH) সঙ্গে পরীক্ষা করা হয় = Globalization.UnicodeCategory.SpaceSeparator
smirkingman

উত্তর:


196
string cleanedString = System.Text.RegularExpressions.Regex.Replace(dirtyString,@"\s+"," ");

40
তবে, আপনার সাথে যদি স্বাচ্ছন্দ্যময় অকালীন অপ্টিমাইজেশন হয় তবে রেজেক্সকে এড়িয়ে চলা
টিম হুলিহান

8
যদি আপনি অ্যাপ্লিকেশনটি সময় সমালোচনামূলক না হন তবে এটি ওভারহেড প্রসেসিংয়ের 1 মাইক্রোসেকেন্ড বহন করতে পারে।
ড্যানিয়েল

16
নোট করুন যে '' s 'কেবল সাদা স্পেস প্রতিস্থাপন করে না, তবে নতুন রেখার অক্ষরও প্রতিস্থাপন করে।
বার্ট কায়ার্স 14'09

12
ভাল ক্যাচ, যদি আপনি কেবল শূণ্যস্থানগুলি "[] +" তে প্যাটার্নটি পরিবর্তন করতে চান
টিম হুলিহান

9
একক শ্বেতস্থান প্রতিস্থাপন এড়াতে আপনার কি '+' এর পরিবর্তে '{2,}' ব্যবহার করা উচিত নয়?
Angularsen

52

অন্যান্য পোস্টারগুলি এটি তৈরি করার মতোই এই প্রশ্নটি সহজ নয় (এবং যেমনটি আমি প্রাথমিকভাবে বিশ্বাস করি) - কারণ প্রশ্নটি যেমন হওয়া দরকার তেমন সুনির্দিষ্ট নয়।

"স্পেস" এবং "সাদা স্থান" এর মধ্যে পার্থক্য রয়েছে। যদি আপনি কেবল ফাঁকা স্থান বোঝাতে চান, তবে আপনার একটি রেজিেক্স ব্যবহার করা উচিত " {2,}"। আপনি যদি কোনও শ্বেত স্পেস বলতে চান তবে এটি আলাদা বিষয়। উচিত সব হোয়াইটস্পেস স্পেস রূপান্তরিত করা? শুরুতে ও শেষে মহাকাশের কী হবে?

নীচের মানদণ্ডের জন্য, আমি ধরে নিয়েছি যে আপনি কেবল ফাঁকা জায়গাগুলির প্রতি যত্নশীল হন এবং আপনি একা স্পেসে এমনকি শুরু এবং শেষ পর্যন্ত কিছু করতে চান না।

নোট করুন যে নির্ভুলতা প্রায় সবসময় পারফরম্যান্সের চেয়ে গুরুত্বপূর্ণ। স্প্লিট / জয়েন সলিউশন যে কোনও নেতৃস্থানীয় / পিছনের শ্বেতস্পেসকে সরিয়ে দেয় (এমনকি কেবলমাত্র একক স্পেস) আপনার নির্দিষ্ট প্রয়োজনীয়তাগুলি (যা অবশ্যই অসম্পূর্ণ হতে পারে) অপসারণ করে।

মানদণ্ডটি মিনিবেঞ্চ ব্যবহার করে

using System;
using System.Text.RegularExpressions;
using MiniBench;

internal class Program
{
    public static void Main(string[] args)
    {

        int size = int.Parse(args[0]);
        int gapBetweenExtraSpaces = int.Parse(args[1]);

        char[] chars = new char[size];
        for (int i=0; i < size/2; i += 2)
        {
            // Make sure there actually *is* something to do
            chars[i*2] = (i % gapBetweenExtraSpaces == 1) ? ' ' : 'x';
            chars[i*2 + 1] = ' ';
        }
        // Just to make sure we don't have a \0 at the end
        // for odd sizes
        chars[chars.Length-1] = 'y';

        string bigString = new string(chars);
        // Assume that one form works :)
        string normalized = NormalizeWithSplitAndJoin(bigString);


        var suite = new TestSuite<string, string>("Normalize")
            .Plus(NormalizeWithSplitAndJoin)
            .Plus(NormalizeWithRegex)
            .RunTests(bigString, normalized);

        suite.Display(ResultColumns.All, suite.FindBest());
    }

    private static readonly Regex MultipleSpaces = 
        new Regex(@" {2,}", RegexOptions.Compiled);

    static string NormalizeWithRegex(string input)
    {
        return MultipleSpaces.Replace(input, " ");
    }

    // Guessing as the post doesn't specify what to use
    private static readonly char[] Whitespace =
        new char[] { ' ' };

    static string NormalizeWithSplitAndJoin(string input)
    {
        string[] split = input.Split
            (Whitespace, StringSplitOptions.RemoveEmptyEntries);
        return string.Join(" ", split);
    }
}

কয়েকটি পরীক্ষা চালানো:

c:\Users\Jon\Test>test 1000 50
============ Normalize ============
NormalizeWithSplitAndJoin  1159091 0:30.258 22.93
NormalizeWithRegex        26378882 0:30.025  1.00

c:\Users\Jon\Test>test 1000 5
============ Normalize ============
NormalizeWithSplitAndJoin  947540 0:30.013 1.07
NormalizeWithRegex        1003862 0:29.610 1.00


c:\Users\Jon\Test>test 1000 1001
============ Normalize ============
NormalizeWithSplitAndJoin  1156299 0:29.898 21.99
NormalizeWithRegex        23243802 0:27.335  1.00

এখানে প্রথম সংখ্যাটি পুনরাবৃত্তির সংখ্যা, দ্বিতীয়টি সময় গ্রহণের সময়, এবং তৃতীয়টি একটি সেরা স্কোর যা ১.০ সেরা।

যে দেখায় যে অন্তত (এটি ছাড়া) কিছু কিছু ক্ষেত্রে একটি রেগুলার এক্সপ্রেশন করতে স্প্লিট সুখ্যাতি / একটি খুব গুরুত্বপূর্ণ মার্জিন দ্বারা সমাধান, কখনও কখনও এ যোগ দিন।

যাইহোক, যদি আপনি একটি "সব হোয়াইটস্পেস" প্রয়োজন, তারপর স্প্লিট পরিবর্তন / যোগদান করেন জয় প্রদর্শিত হবে। যেমনটি প্রায়শই ঘটে থাকে, শয়তানটি বিস্তারিতভাবে ...


1
দুর্দান্ত বিশ্লেষণ। সুতরাং দেখা যাচ্ছে যে আমরা উভয়ই বিভিন্ন ডিগ্রীতে সঠিক ছিল। আমার উত্তরের কোডটি একটি বৃহত ফাংশন থেকে নেওয়া হয়েছিল যা স্ট্রিংয়ের মধ্যে থেকে এবং শুরু এবং শেষ থেকে সমস্ত সাদা স্থান এবং / অথবা অক্ষরগুলি নিয়ন্ত্রণ করার ক্ষমতা রাখে।
স্কট ডরম্যান

1
কেবলমাত্র শ্বেতক্ষেত্রের অক্ষরগুলির দ্বারা আপনি নির্দিষ্ট করেছেন, আমার বেশিরভাগ পরীক্ষায় রেজেনেক্স এবং স্প্লিট / জয়েন প্রায় সমান ছিল - এস / জে সঠিকতা এবং জটিলতার ব্যয়ে একটি ক্ষুদ্র, ক্ষুদ্র উপকার পেয়েছিল। এই কারণে, আমি সাধারণত রেজেক্স পছন্দ করি। আমাকে ভুল করবেন না - আমি একজন রেইজেক্স ফ্যানবয় থেকে অনেক দূরে, তবে পারফরম্যান্সের প্রথম পরীক্ষা না করে পারফরম্যান্সের জন্য আরও জটিল কোড লেখা পছন্দ করি না।
জন স্কিটে

নরমালাইজ উইথস্প্লিটএন্ডজউইন আরও অনেক বেশি আবর্জনা তৈরি করবে, সত্যিই সমস্যাটি আরও বেশি জিসি সময় হিট হয়ে যাবে কিনা তা বলা শক্ত, তবে বেঞ্চমার্ক।
ইয়ান রিংরোজ

@ আইয়ানআরিংরোজ কোন ধরণের আবর্জনা তৈরি করা যেতে পারে?
দ্রোঞ্জ

18

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

এটিতে এটি পরিবর্তন করুন:

string s = System.Text.RegularExpressions.Regex.Replace(s, @"\s{2,}", " "); 

আমার এক সমস্যাটি @"\s{2,}"হ'ল এটি একক ট্যাব এবং অন্য ইউনিকোড স্পেস অক্ষরগুলিকে একটি স্থানের সাথে প্রতিস্থাপন করতে ব্যর্থ। আপনি যদি কোনও স্থান দিয়ে 2 টি ট্যাব প্রতিস্থাপন করতে চলেছেন তবে আপনার সম্ভবত 1 টি ট্যাবটি একটি স্থানের সাথে প্রতিস্থাপন করা উচিত। @"\s+"এটা তোমার জন্য করবে
ডেভিড স্পেচেট

17

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

public static string DontUseThisToCollapseSpaces(string text)
{
    while (text.IndexOf("  ") != -1)
    {
        text = text.Replace("  ", " ");
    }
    return text;
}

এটি চিরতরে লুপ করতে পারে। কেন কেউ অনুমান করার জন্য যত্নশীল? (কয়েক বছর আগে যখন এটি একটি নিউজ গ্রুপের প্রশ্ন হিসাবে জিজ্ঞাসা করা হয়েছিল তখন আমি কেবল এটি পেরিয়ে এসেছি ... কেউ আসলে সমস্যা হিসাবে এটিকে দেখিয়েছে।)


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

19
কারণ ইন্ডেক্সঅফ কিছু ইউনিকোড চরিত্রকে উপেক্ষা করে, এই ক্ষেত্রে সুনির্দিষ্ট অপরাধী কিছু এশীয় চরিত্রের আইরিস। গুগল অনুসারে হুম, শূন্য-প্রস্থের নন-সংযুক্তকারী।
অহোকার

আমি শিখেছি যে হার্ড উপায় :( স্ট্যাকওভারফ্লো.com
অ্যান্টোনিও বাকুলা

আমি অনেক কষ্ট করে শিখেছি. দুটি জিরো প্রস্থ নন জোয়ারার (\ u200C \ u200C) সহ এস্পেশেলি সূচকগুলি এই "ডাবল স্পেস" এর সূচক ফেরত দেয় তবে প্রতিস্থাপন এটি প্রতিস্থাপন করে না। আমি মনে করি কারণ এটি সূচিপত্রের জন্য, আপনার প্রতিস্থাপনের মতো আচরণ করার জন্য স্ট্রিংকম্পারিয়ান (অর্ডিনাল) নির্দিষ্ট করা দরকার। এইভাবে, এই দুজনের কোনওটিই "ডাবল স্পেস" সনাক্ত করবে না। স্ট্রিংকম্পারিশন ডকস.মাইক্রোসফট
মার্টিন

4

ইতিমধ্যে চিহ্নিত হিসাবে, এটি সহজেই একটি নিয়মিত প্রকাশ দ্বারা সম্পন্ন হয়। আমি কেবল যুক্ত করব যে আপনি নেতৃস্থানীয় / পিছনের শ্বেতস্থান থেকে মুক্তি পেতে এর জন্য একটি .trim () যুক্ত করতে চান।


4

সমাধান আমি এখানে কাজ করে। RegEx এবং স্ট্রিং.স্প্লিট ছাড়া।

public static string TrimWhiteSpace(this string Value)
{
    StringBuilder sbOut = new StringBuilder();
    if (!string.IsNullOrEmpty(Value))
    {
        bool IsWhiteSpace = false;
        for (int i = 0; i < Value.Length; i++)
        {
            if (char.IsWhiteSpace(Value[i])) //Comparion with WhiteSpace
            {
                if (!IsWhiteSpace) //Comparison with previous Char
                {
                    sbOut.Append(Value[i]);
                    IsWhiteSpace = true;
                }
            }
            else
            {
                IsWhiteSpace = false;
                sbOut.Append(Value[i]);
            }
        }
    }
    return sbOut.ToString();
}

তাই আপনি পারেন:

string cleanedString = dirtyString.TrimWhiteSpace();

4

দ্রুত অতিরিক্ত হোয়াইটস্পেস রিমুভার ... এটি দ্রুততম এবং ফিলিপ মাচাডোর স্থানের অনুলিপিটির উপর ভিত্তি করে।

static string InPlaceCharArray(string str)
{
    var len = str.Length;
    var src = str.ToCharArray();
    int dstIdx = 0;
    bool lastWasWS = false;
    for (int i = 0; i < len; i++)
    {
        var ch = src[i];
        if (src[i] == '\u0020')
        {
            if (lastWasWS == false)
            {
                src[dstIdx++] = ch;
                lastWasWS = true;
            }
        }
        else
        { 
            lastWasWS = false;
            src[dstIdx++] = ch;
        }
    }
    return new string(src, 0, dstIdx);
}

মানদণ্ড ...

ইনপ্লেসচারআর্রেস্পেস কেবল কোডপ্রজেক্ট 2015 এ ফিলিপ মাচাডো দ্বারা এবং বহু-স্থান অপসারণের জন্য সানসেটকোস্ট দ্বারা সংশোধিত। সময়: 3.75 টিক্স

ইনপ্লেসচারআরে ফিলিপ মাচাডো 2015 এবং বহু-স্থান অপসারণের জন্য সানসেটকোস্ট দ্বারা কিছুটা সংশোধন করা হয়েছে। সময় 6.50 টিক্স (ট্যাবগুলিকেও সমর্থন করে)

জন স্কিটির রচনা স্প্লিটএন্ডজাইনঅনস্পেস । সময়: 13.25 টিক্স

ফুবু সময় দ্বারা স্ট্রিংবিল্ডার : 13.5 টিক্স (ট্যাবগুলিও সমর্থন করে)

দ্বারা কম্পাইল সঙ্গে Regex জন স্কিটসময়: 17 টি টিক্স

ডেভিড এস দ্বারা স্ট্রিংবিল্ডার 2013 সময়: 30.5 টিক্স

ব্র্যান্ডন সময় দ্বারা সংকলনবিহীন রিজেক্স: 63.25 টিক্স icks

ব্যবহারকারীর দ্বারা স্ট্রিংবিল্ডার 214147 সময়: 77.125 টিক্স

অ-সংকলন টিম হুলিহান সময় সহ রেগেক্স: 147.25 টিক্স

বেঞ্চমার্ক কোড ...

using System;
using System.Text.RegularExpressions;
using System.Diagnostics;
using System.Threading;
using System.Text;

static class Program
{
    public static void Main(string[] args)
    {
    long seed = ConfigProgramForBenchmarking();

    Stopwatch sw = new Stopwatch();

    string warmup = "This is   a Warm  up function for best   benchmark results." + seed;
    string input1 = "Hello World,    how are   you           doing?" + seed;
    string input2 = "It\twas\t \tso    nice  to\t\t see you \tin 1950.  \t" + seed;
    string correctOutput1 = "Hello World, how are you doing?" + seed;
    string correctOutput2 = "It\twas\tso nice to\tsee you in 1950. " + seed;
    string output1,output2;

    //warm-up timer function
    sw.Restart();
    sw.Stop();

    sw.Restart();
    sw.Stop();
    long baseVal = sw.ElapsedTicks;

    // InPlace Replace by Felipe Machado but modified by Ryan for multi-space removal (http://www.codeproject.com/Articles/1014073/Fastest-method-to-remove-all-whitespace-from-Strin)
    output1 = InPlaceCharArraySpaceOnly (warmup);
    sw.Restart();
    output1 = InPlaceCharArraySpaceOnly (input1);
    output2 = InPlaceCharArraySpaceOnly (input2);
    sw.Stop();
    Console.WriteLine("InPlaceCharArraySpaceOnly : " + (sw.ElapsedTicks - baseVal));
    Console.WriteLine("  Trial1:(spaces only) " + (output1 == correctOutput1 ? "PASS " : "FAIL "));
    Console.WriteLine("  Trial2:(spaces+tabs) " + (output2 == correctOutput2 ? "PASS " : "FAIL "));

    // InPlace Replace by Felipe R. Machado and slightly modified by Ryan for multi-space removal (http://www.codeproject.com/Articles/1014073/Fastest-method-to-remove-all-whitespace-from-Strin)
    output1 = InPlaceCharArray(warmup);
    sw.Restart();
    output1 = InPlaceCharArray(input1);
    output2 = InPlaceCharArray(input2);
    sw.Stop();
    Console.WriteLine("InPlaceCharArray: " + (sw.ElapsedTicks - baseVal));
    Console.WriteLine("  Trial1:(spaces only) " + (output1 == correctOutput1 ? "PASS " : "FAIL "));
    Console.WriteLine("  Trial2:(spaces+tabs) " + (output2 == correctOutput2 ? "PASS " : "FAIL "));

    //Regex with non-compile Tim Hoolihan (https://stackoverflow.com/a/1279874/2352507)
    string cleanedString = 
    output1 = Regex.Replace(warmup, @"\s+", " ");
    sw.Restart();
    output1 = Regex.Replace(input1, @"\s+", " ");
    output2 = Regex.Replace(input2, @"\s+", " ");
    sw.Stop();
    Console.WriteLine("Regex by Tim Hoolihan: " + (sw.ElapsedTicks - baseVal));
    Console.WriteLine("  Trial1:(spaces only) " + (output1 == correctOutput1 ? "PASS " : "FAIL "));
    Console.WriteLine("  Trial2:(spaces+tabs) " + (output2 == correctOutput2 ? "PASS " : "FAIL "));

    //Regex with compile by Jon Skeet (https://stackoverflow.com/a/1280227/2352507)
    output1 = MultipleSpaces.Replace(warmup, " ");
    sw.Restart();
    output1 = MultipleSpaces.Replace(input1, " ");
    output2 = MultipleSpaces.Replace(input2, " ");
    sw.Stop();
    Console.WriteLine("Regex with compile by Jon Skeet: " + (sw.ElapsedTicks - baseVal));
    Console.WriteLine("  Trial1:(spaces only) " + (output1 == correctOutput1 ? "PASS " : "FAIL "));
    Console.WriteLine("  Trial2:(spaces+tabs) " + (output2 == correctOutput2 ? "PASS " : "FAIL "));

    //Split And Join by Jon Skeet (https://stackoverflow.com/a/1280227/2352507)
    output1 = SplitAndJoinOnSpace(warmup);
    sw.Restart();
    output1 = SplitAndJoinOnSpace(input1);
    output2 = SplitAndJoinOnSpace(input2);
    sw.Stop();
    Console.WriteLine("Split And Join by Jon Skeet: " + (sw.ElapsedTicks - baseVal));
    Console.WriteLine("  Trial1:(spaces only) " + (output1 == correctOutput1 ? "PASS " : "FAIL "));
    Console.WriteLine("  Trial2:(spaces+tabs) " + (output2 == correctOutput2 ? "PASS " : "FAIL "));

    //Regex by Brandon (https://stackoverflow.com/a/1279878/2352507
    output1 = Regex.Replace(warmup, @"\s{2,}", " ");
    sw.Restart();
    output1 = Regex.Replace(input1, @"\s{2,}", " ");
    output2 = Regex.Replace(input2, @"\s{2,}", " ");
    sw.Stop();
    Console.WriteLine("Regex by Brandon: " + (sw.ElapsedTicks - baseVal));
    Console.WriteLine("  Trial1:(spaces only) " + (output1 == correctOutput1 ? "PASS " : "FAIL "));
    Console.WriteLine("  Trial2:(spaces+tabs) " + (output2 == correctOutput2 ? "PASS " : "FAIL "));

    //StringBuilder by user214147 (https://stackoverflow.com/a/2156660/2352507
    output1 = user214147(warmup);
    sw.Restart();
    output1 = user214147(input1);
    output2 = user214147(input2);
    sw.Stop();
    Console.WriteLine("StringBuilder by user214147: " + (sw.ElapsedTicks - baseVal));
    Console.WriteLine("  Trial1:(spaces only) " + (output1 == correctOutput1 ? "PASS " : "FAIL "));
    Console.WriteLine("  Trial2:(spaces+tabs) " + (output2 == correctOutput2 ? "PASS " : "FAIL "));

    //StringBuilder by fubo (https://stackoverflow.com/a/27502353/2352507
    output1 = fubo(warmup);
    sw.Restart();
    output1 = fubo(input1);
    output2 = fubo(input2);
    sw.Stop();
    Console.WriteLine("StringBuilder by fubo: " + (sw.ElapsedTicks - baseVal));
    Console.WriteLine("  Trial1:(spaces only) " + (output1 == correctOutput1 ? "PASS " : "FAIL "));
    Console.WriteLine("  Trial2:(spaces+tabs) " + (output2 == correctOutput2 ? "PASS " : "FAIL "));


    //StringBuilder by David S 2013 (https://stackoverflow.com/a/16035044/2352507)
    output1 = SingleSpacedTrim(warmup);
    sw.Restart();
    output1 = SingleSpacedTrim(input1);
    output2 = SingleSpacedTrim(input2);
    sw.Stop();
    Console.WriteLine("StringBuilder(SingleSpacedTrim) by David S: " + (sw.ElapsedTicks - baseVal));
    Console.WriteLine("  Trial1:(spaces only) " + (output1 == correctOutput1 ? "PASS " : "FAIL "));
    Console.WriteLine("  Trial2:(spaces+tabs) " + (output2 == correctOutput2 ? "PASS " : "FAIL "));
}

// InPlace Replace by Felipe Machado and slightly modified by Ryan for multi-space removal (http://www.codeproject.com/Articles/1014073/Fastest-method-to-remove-all-whitespace-from-Strin)
static string InPlaceCharArray(string str)
{
    var len = str.Length;
    var src = str.ToCharArray();
    int dstIdx = 0;
    bool lastWasWS = false;
    for (int i = 0; i < len; i++)
    {
        var ch = src[i];
        if (src[i] == '\u0020')
        {
            if (lastWasWS == false)
            {
                src[dstIdx++] = ch;
                lastWasWS = true;
            }
        }
        else
        { 
            lastWasWS = false;
            src[dstIdx++] = ch;
        }
    }
    return new string(src, 0, dstIdx);
}

// InPlace Replace by Felipe R. Machado but modified by Ryan for multi-space removal (http://www.codeproject.com/Articles/1014073/Fastest-method-to-remove-all-whitespace-from-Strin)
static string InPlaceCharArraySpaceOnly (string str)
{
    var len = str.Length;
    var src = str.ToCharArray();
    int dstIdx = 0;
    bool lastWasWS = false; //Added line
    for (int i = 0; i < len; i++)
    {
        var ch = src[i];
        switch (ch)
        {
            case '\u0020': //SPACE
            case '\u00A0': //NO-BREAK SPACE
            case '\u1680': //OGHAM SPACE MARK
            case '\u2000': // EN QUAD
            case '\u2001': //EM QUAD
            case '\u2002': //EN SPACE
            case '\u2003': //EM SPACE
            case '\u2004': //THREE-PER-EM SPACE
            case '\u2005': //FOUR-PER-EM SPACE
            case '\u2006': //SIX-PER-EM SPACE
            case '\u2007': //FIGURE SPACE
            case '\u2008': //PUNCTUATION SPACE
            case '\u2009': //THIN SPACE
            case '\u200A': //HAIR SPACE
            case '\u202F': //NARROW NO-BREAK SPACE
            case '\u205F': //MEDIUM MATHEMATICAL SPACE
            case '\u3000': //IDEOGRAPHIC SPACE
            case '\u2028': //LINE SEPARATOR
            case '\u2029': //PARAGRAPH SEPARATOR
            case '\u0009': //[ASCII Tab]
            case '\u000A': //[ASCII Line Feed]
            case '\u000B': //[ASCII Vertical Tab]
            case '\u000C': //[ASCII Form Feed]
            case '\u000D': //[ASCII Carriage Return]
            case '\u0085': //NEXT LINE
                if (lastWasWS == false) //Added line
                {
                    src[dstIdx++] = ch; //Added line
                    lastWasWS = true; //Added line
                }
            continue;
            default:
                lastWasWS = false; //Added line 
                src[dstIdx++] = ch;
                break;
        }
    }
    return new string(src, 0, dstIdx);
}

static readonly Regex MultipleSpaces =
    new Regex(@" {2,}", RegexOptions.Compiled);

//Split And Join by Jon Skeet (https://stackoverflow.com/a/1280227/2352507)
static string SplitAndJoinOnSpace(string input)
{
    string[] split = input.Split(new char[] { ' '}, StringSplitOptions.RemoveEmptyEntries);
    return string.Join(" ", split);
}

//StringBuilder by user214147 (https://stackoverflow.com/a/2156660/2352507
public static string user214147(string S)
{
    string s = S.Trim();
    bool iswhite = false;
    int iwhite;
    int sLength = s.Length;
    StringBuilder sb = new StringBuilder(sLength);
    foreach (char c in s.ToCharArray())
    {
        if (Char.IsWhiteSpace(c))
        {
            if (iswhite)
            {
                //Continuing whitespace ignore it.
                continue;
            }
            else
            {
                //New WhiteSpace

                //Replace whitespace with a single space.
                sb.Append(" ");
                //Set iswhite to True and any following whitespace will be ignored
                iswhite = true;
            }
        }
        else
        {
            sb.Append(c.ToString());
            //reset iswhitespace to false
            iswhite = false;
        }
    }
    return sb.ToString();
}

//StringBuilder by fubo (https://stackoverflow.com/a/27502353/2352507
public static string fubo(this string Value)
{
    StringBuilder sbOut = new StringBuilder();
    if (!string.IsNullOrEmpty(Value))
    {
        bool IsWhiteSpace = false;
        for (int i = 0; i < Value.Length; i++)
        {
            if (char.IsWhiteSpace(Value[i])) //Comparison with WhiteSpace
            {
                if (!IsWhiteSpace) //Comparison with previous Char
                {
                    sbOut.Append(Value[i]);
                    IsWhiteSpace = true;
                }
            }
            else
            {
                IsWhiteSpace = false;
                sbOut.Append(Value[i]);
            }
        }
    }
    return sbOut.ToString();
}

//David S. 2013 (https://stackoverflow.com/a/16035044/2352507)
public static String SingleSpacedTrim(String inString)
{
    StringBuilder sb = new StringBuilder();
    Boolean inBlanks = false;
    foreach (Char c in inString)
    {
        switch (c)
        {
            case '\r':
            case '\n':
            case '\t':
            case ' ':
                if (!inBlanks)
                {
                    inBlanks = true;
                    sb.Append(' ');
                }
                continue;
            default:
                inBlanks = false;
                sb.Append(c);
                break;
        }
    }
    return sb.ToString().Trim();
}

/// <summary>
/// We want to run this item with max priory to lower the odds of
/// the OS from doing program context switches in the middle of our code. 
/// source:https://stackoverflow.com/a/16157458 
/// </summary>
/// <returns>random seed</returns>
private static long ConfigProgramForBenchmarking()
{
    //prevent the JIT Compiler from optimizing Fkt calls away
    long seed = Environment.TickCount;
    //use the second Core/Processor for the test
    Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(2);
    //prevent "Normal" Processes from interrupting Threads
    Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
    //prevent "Normal" Threads from interrupting this thread
    Thread.CurrentThread.Priority = ThreadPriority.Highest;
    return seed;
}

}

বেঞ্চমার্ক নোটগুলি: রিলিজ মোড, নো-ডিবাগার সংযুক্ত, আই 7 প্রসেসর, গড় 4 রান, কেবল সংক্ষিপ্ত স্ট্রিং পরীক্ষা করা হয়েছে


1
আমার নিবন্ধটি এখানে রেফারেন্স দেখে ভাল লাগল! (আমি ফিলিপ মাচাডো) আমি বেঞ্চমার্কডটনেট নামে একটি সঠিক বেঞ্চমার্ক সরঞ্জাম ব্যবহার করে এটি আপডেট করতে চলেছি! আমি সমস্ত রানটাইমগুলিতে রান সেটআপ করার চেষ্টা করব (এখন যে আমাদের কাছে ডট নেট কোর এবং পছন্দগুলি রয়েছে ...
লাউডেনভিয়ার

1
@ লাউডেনভিয়ার - এটি নিয়ে দুর্দান্ত কাজ। আপনার প্রায় 400% দ্রুততম ছিল! । নেট কোরটি নিখরচায় 150-200% পারফরম্যান্স বৃদ্ধির মতো। এটি সি ++ পারফরম্যান্সের কাছাকাছি চলেছে তবে কোড করা অনেক সহজ। মন্তব্যের জন্য ধন্যবাদ.
সানসেট কোয়েস্ট

এটি কেবল ফাঁকা স্থানগুলি করে, অন্য সাদা স্থানের অক্ষরগুলি নয়। হতে পারে আপনি src [i] == '\ u0020' এর পরিবর্তে char.IsWhiteSpace (ch) চান। আমি লক্ষ্য করি এটি সম্প্রদায় দ্বারা সম্পাদিত হয়েছে। তারা কি এটিকে বিরক্ত করেছিল?
Pভিল পায়রা

3

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

    public static string NormalizeWhiteSpace(string S)
    {
        string s = S.Trim();
        bool iswhite = false;
        int iwhite;
        int sLength = s.Length;
        StringBuilder sb = new StringBuilder(sLength);
        foreach(char c in s.ToCharArray())
        {
            if(Char.IsWhiteSpace(c))
            {
                if (iswhite)
                {
                    //Continuing whitespace ignore it.
                    continue;
                }
                else
                {
                    //New WhiteSpace

                    //Replace whitespace with a single space.
                    sb.Append(" ");
                    //Set iswhite to True and any following whitespace will be ignored
                    iswhite = true;
                }  
            }
            else
            {
                sb.Append(c.ToString());
                //reset iswhitespace to false
                iswhite = false;
            }
        }
        return sb.ToString();
    }

2

জন স্কিটি পোস্ট করেছে যে পরীক্ষা প্রোগ্রামটি ব্যবহার করে, আমি চেষ্টা করেছি যে আমি দ্রুত চালাতে কোনও হাতের লিখিত লুপ পাব কিনা।
আমি প্রতিবার নরমালাইজ উইথস্প্লিটএন্ডজয়িনকে পরাজিত করতে পারি তবে কেবলমাত্র 1000, 5 এর ইনপুট দিয়ে নরমালাইজ উইথআরেজেক্সকে পরাজিত করতে পারি।

static string NormalizeWithLoop(string input)
{
    StringBuilder output = new StringBuilder(input.Length);

    char lastChar = '*';  // anything other then space 
    for (int i = 0; i < input.Length; i++)
    {
        char thisChar = input[i];
        if (!(lastChar == ' ' && thisChar == ' '))
            output.Append(thisChar);

        lastChar = thisChar;
    }

    return output.ToString();
}

আমি জিটারটি উত্পাদিত মেশিন কোডের দিকে নজর দিইনি, তবে আমি আশা করি যে সমস্যাটি স্ট্রিংবিল্ডার.অপেন্ড () এ কল করার সময় নিয়েছে এবং অনিরাপদ কোড ব্যবহারের প্রয়োজন হবে আরও ভাল করার জন্য।

তাই রেজেক্সস.প্লিজ () খুব দ্রুত এবং বীট করা শক্ত !!


2

VB.NET

Linha.Split(" ").ToList().Where(Function(x) x <> " ").ToArray

সি শার্প

Linha.Split(" ").ToList().Where(x => x != " ").ToArray();

লিনকিউ = ডি এর পাওয়ার উপভোগ করুন


একদম ঠিক! আমার কাছে এটিও সবচেয়ে মার্জিত পদ্ধতি। সুতরাং রেকর্ডের জন্য, সি # তে এটি হবে:string.Join(" ", myString.Split(' ').Where(s => s != " ").ToArray())
এফ্রেন

1
Splitসমস্ত শ্বেতস্থান ধরতে এবং Whereধারাটি অপসারণ করতে সামান্য উন্নতি :myString.Split(null as char[], StringSplitOptions.RemoveEmptyEntries)
ডেভিড

1
Regex regex = new Regex(@"\W+");
string outputString = regex.Replace(inputString, " ");

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

0

সবচেয়ে ছোট সমাধান:

var regExp = / \ s + / g, newString = oldString.replace (regExp, '');


0

আপনি এটি চেষ্টা করতে পারেন:

    /// <summary>
    /// Remove all extra spaces and tabs between words in the specified string!
    /// </summary>
    /// <param name="str">The specified string.</param>
    public static string RemoveExtraSpaces(string str)
    {
        str = str.Trim();
        StringBuilder sb = new StringBuilder();
        bool space = false;
        foreach (char c in str)
        {
            if (char.IsWhiteSpace(c) || c == (char)9) { space = true; }
            else { if (space) { sb.Append(' '); }; sb.Append(c); space = false; };
        }
        return sb.ToString();
    }

0

প্রতিস্থাপন গোষ্ঠীগুলি একই একক একাধিক সাদা স্থান অক্ষরের প্রতিস্থাপনের জন্য সমাধানের কার্যকর পদ্ধতি সরবরাহ করে :

    public static void WhiteSpaceReduce()
    {
        string t1 = "a b   c d";
        string t2 = "a b\n\nc\nd";

        Regex whiteReduce = new Regex(@"(?<firstWS>\s)(?<repeatedWS>\k<firstWS>+)");
        Console.WriteLine("{0}", t1);
        //Console.WriteLine("{0}", whiteReduce.Replace(t1, x => x.Value.Substring(0, 1))); 
        Console.WriteLine("{0}", whiteReduce.Replace(t1, @"${firstWS}"));
        Console.WriteLine("\nNext example ---------");
        Console.WriteLine("{0}", t2);
        Console.WriteLine("{0}", whiteReduce.Replace(t2, @"${firstWS}"));
        Console.WriteLine();
    }

দয়া করে দ্বিতীয় উদাহরণটি একক রাখার জন্য লক্ষ্য রাখবেন \nযখন গৃহীত উত্তরগুলি স্থানের সাথে লাইনের শেষটিকে প্রতিস্থাপন করবে।

আপনার যদি প্রথম স্থানটির সাথে কোনও সাদা স্থানের অক্ষরের কোনও সংমিশ্রণ প্রতিস্থাপন করতে হয় তবে কেবল \kপ্যাটার্নটি থেকে পিছনের রেফারেন্সটি সরিয়ে ফেলুন ।


0

2 বা ততোধিক সাদা স্পেস একক স্পেসের সাথে প্রতিস্থাপনের জন্য নিয়মিত এক্সপ্রেশন ব্যবহার করাও একটি ভাল সমাধান।

আমরা " \ গুলি + " হিসাবে রেজেক্স প্যাটার্নটি ব্যবহার করছি ।

  • a গুলি একটি স্থান, ট্যাব, নতুন লাইন, ক্যারেজ রিটার্ন, ফর্ম ফিড বা উল্লম্ব ট্যাবের সাথে মেলে।

  • '+' এক বা একাধিক ঘটনা বলে।

রেজেক্স উদাহরণ

String blogName = "  Sourav .  Pal.   "

 String nameWithProperSpacing = blogName.replaceAll("\\s+", " ");   
System.out.println( nameWithProperSpacing );

-1

এটি করার জন্য কোনও উপায় তৈরি করা হয়নি। আপনি এটি চেষ্টা করতে পারেন:

private static readonly char[] whitespace = new char[] { ' ', '\n', '\t', '\r', '\f', '\v' };
public static string Normalize(string source)
{
   return String.Join(" ", source.Split(whitespace, StringSplitOptions.RemoveEmptyEntries));
}

এটি নেতৃস্থানীয় এবং পেছনের সাদা অংশটি সরিয়ে দেবে পাশাপাশি কোনও অভ্যন্তরীণ শ্বেতস্থানকে একক সাদা বর্ণের অক্ষরে collapse যদি আপনি সত্যিই কেবল ফাঁকা জায়গাগুলি ভাঙতে চান তবে নিয়মিত প্রকাশের সাহায্যে সমাধানগুলি আরও ভাল; অন্যথায় এই সমাধান আরও ভাল। ( জন স্কিটির করা বিশ্লেষণ দেখুন ))


7
যদি নিয়মিত এক্সপ্রেশনটি সংকলিত এবং ক্যাশে থাকে তবে আমি নিশ্চিত নই যে বিভাজন এবং যোগদানের চেয়ে বেশি ওভারহেড রয়েছে যা মধ্যবর্তী আবর্জনার স্ট্রিংয়ের ভার তৈরি করতে পারে । আপনার পথটি দ্রুত গতিবেগ ধরে যাওয়ার আগে কি আপনি উভয় পদ্ধতির সাবধানতার সাথে মানদণ্ডটি করেছেন?
জন স্কিটে

1
হোয়াইটস্পেস এখানে অঘোষিত
টিম হুলিহান

3
ওভারহেডের কথা বললে, কেন আপনি পৃথিবীতে কল করছেন source.ToCharArray()এবং তারপরে ফলাফলটি ফেলে দিচ্ছেন?
জন স্কিটে

2
আর কলিং ToCharArray()string.Join এর ফলাফলে, শুধুমাত্র একটি নতুন স্ট্রিং ... ঘেউ তৈরি করতে যে একটি পোস্টে করা জন্য ওভারহেড অভিযোগ শুধু লক্ষণীয়। -1।
জন স্কিটে

1
ওহ, এবং ধরে নেওয়া whitespaceহচ্ছে new char[] { ' ' }, যদি ইনপুট স্ট্রিংটি কোনও স্থান দিয়ে শুরু হয় বা শেষ হয় তবে এটি ভুল ফলাফল দেয়।
জন স্কিটে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.