ฉันจะแทนที่ช่องว่างหลายรายการในสตริงด้วยช่องว่างเดียวใน 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 "