ฉันจะแทนที่ช่องว่างหลายรายการในสตริงด้วยช่องว่างเดียวใน 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 ));
              ฉันคิดว่าคำตอบของ Matt ดีที่สุด แต่ฉันไม่เชื่อว่ามันค่อนข้างถูก หากคุณต้องการแทนที่บรรทัดใหม่คุณต้องใช้:
myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline);
              อีกวิธีหนึ่งซึ่งใช้ LINQ:
 var list = str.Split(' ').Where(s => !string.IsNullOrWhiteSpace(s));
 str = string.Join(" ", list);
              มันง่ายกว่านั้นมาก:
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 เท่าโดยเฉลี่ยด้วยชุดสตริงขนาดเล็กถึงขนาดกลางที่มีขนาดใหญ่มากเทียบกับ Regex ที่รวบรวมแบบคงที่ เมื่อเทียบกับ Regex ที่ไม่ได้รวบรวมหรือไม่คงที่นี่ควรจะเร็วยิ่งขึ้น
โปรดทราบว่ามันไม่ได้ลบช่องว่างนำหน้าหรือตามหลัง แต่มีเหตุการณ์เกิดขึ้นหลายครั้งเท่านั้น
คุณสามารถทำได้ในโซลูชันเดียว!
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 IL ในเวลารวบรวม:
Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled);
temp = singleSpacify.Replace(temp, " ");
              ไม่มี Regex, ไม่มี Linq ... ลบช่องว่างนำหน้าและต่อท้ายรวมทั้งลดพื้นที่ว่างหลาย ๆ ส่วนที่ฝังลงในหนึ่งช่องว่าง
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());
}
หนึ่งในสิ่งที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้คือมันทำงานกับคอลเลกชันที่ไม่ได้เป็นสตริงโดยการเรียก ToString () บนองค์ประกอบ การใช้งานยังคงเหมือนเดิม:
//...
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 Buddy รูปแบบนี้จะแทนที่ช่องว่างคู่ทั้งหมดด้วยช่องว่างเดียวและยังตัดแต่งช่องว่างนำหน้าและต่อท้าย
pattern: (?m:^ +| +$|( ){2,})
replacement: $1
มันยากที่จะอ่านเล็กน้อยเนื่องจากเรากำลังจัดการกับพื้นที่ว่างดังนั้นที่นี่จึงเป็น "ช่องว่าง" แทนที่ด้วย "_" อีกครั้ง
pattern: (?m:^_+|_+$|(_){2,})  <-- don't use this, just for illustration.
โครงสร้าง "(? m:" เปิดใช้งานตัวเลือก "หลายบรรทัด" โดยทั่วไปฉันต้องการรวมตัวเลือกใด ๆ ที่ฉันสามารถทำได้ในรูปแบบของตัวเองเพื่อให้มีอยู่ในตัวเองมากขึ้น
มีคำตอบมากมายที่ให้ผลลัพธ์ที่ถูกต้อง แต่สำหรับผู้ที่มองหาผลงานที่ดีที่สุดฉันได้ปรับปรุงคำตอบของ Nolanar (ซึ่งเป็นคำตอบที่ดีที่สุดสำหรับการแสดง) ประมาณ 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.
              ใช้รูปแบบ regex
    [ ]+    #only space
   var text = Regex.Replace(inputString, @"[ ]+", " ");
              ลองใช้วิธีนี้
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 " ) );
              โดยไม่ใช้นิพจน์ทั่วไป:
while (myString.IndexOf("  ", StringComparison.CurrentCulture) != -1)
{
    myString = myString.Replace("  ", " ");
}
ตกลงที่จะใช้กับสตริงสั้น ๆ แต่จะทำงานได้ไม่ดีกับสตริงยาวที่มีช่องว่างมากมาย
การผสมผสานของStringBuilderและEnumerable.Aggregate ()เป็นวิธีเสริมสำหรับสตริง:
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 "