ฉันมีสตริงในรูปแบบต่อไปนี้
string s = "This is a Test String.\n This is a next line.\t This is a tab.\n'
ฉันต้องการลบสิ่งที่เกิดขึ้นทั้งหมด\n
และ\r
จากสตริงด้านบน
ฉันลองแล้วstring s = s.Trim(new char[] {'\n', '\r'});
แต่ก็ไม่ได้ช่วยอะไร
ฉันมีสตริงในรูปแบบต่อไปนี้
string s = "This is a Test String.\n This is a next line.\t This is a tab.\n'
ฉันต้องการลบสิ่งที่เกิดขึ้นทั้งหมด\n
และ\r
จากสตริงด้านบน
ฉันลองแล้วstring s = s.Trim(new char[] {'\n', '\r'});
แต่ก็ไม่ได้ช่วยอะไร
คำตอบ:
ฉันชอบที่จะใช้การแสดงออกปกติ ในกรณีนี้คุณสามารถทำได้:
string replacement = Regex.Replace(s, @"\t|\n|\r", "");
นิพจน์ทั่วไปไม่ได้รับความนิยมในโลก. NET เหมือนกับภาษาไดนามิก แต่มีพลังมากมายในการจัดการสตริง
คุณต้องการใช้String.Replace
เพื่อลบอักขระ
s = s.Replace("\n", String.Empty);
s = s.Replace("\r", String.Empty);
s = s.Replace("\t", String.Empty);
โปรดทราบว่าString.Trim(params char[] trimChars)
จะลบเฉพาะอักขระนำหน้าและต่อท้ายเท่านั้นtrimChars
จากอินสแตนซ์ที่เรียกใช้
คุณสามารถสร้างวิธีการต่อขยายซึ่งจะช่วยหลีกเลี่ยงปัญหาด้านประสิทธิภาพในการสร้างสตริงชั่วคราวจำนวนมาก:
static string RemoveChars(this string s, params char[] removeChars) {
Contract.Requires<ArgumentNullException>(s != null);
Contract.Requires<ArgumentNullException>(removeChars != null);
var sb = new StringBuilder(s.Length);
foreach(char c in s) {
if(!removeChars.Contains(c)) {
sb.Append(c);
}
}
return sb.ToString();
}
ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ฉันคิดว่าฉันจะแบ่งปันวิธีที่ฉันใช้เพื่อลบอักขระบรรทัดใหม่
s.Replace(Environment.NewLine, "");
อ้างอิง:
MSDN String.Replace วิธีการและคุณสมบัติ MSDN Environment.NewLine
หากความเร็วและการใช้หน่วยความจำต่ำมีความสำคัญให้ทำสิ่งนี้:
var sb = new StringBuilder(s.Length);
foreach (char i in s)
if (i != '\n' && i != '\r' && i != '\t')
sb.Append(i);
s = sb.ToString();
แค่ทำอย่างนั้น
s = s.Replace("\n", String.Empty).Replace("\t", String.Empty).Replace("\r", String.Empty);
แนวทาง LINQ:
string s = "This is a Test String.\n This is a next line.\t This is a tab.\n'";
string s1 = String.Join("", s.Where(c => c != '\n' && c != '\r' && c != '\t'));
string.Join
ที่จะเรียกร้องToString
ในแต่ละchar
คืนโดยแบบสอบถาม ดีกว่าที่จะเพียงส่งผลลัพธ์แบบสอบถามไปยังตัวstring
สร้าง s1 = new string(s.Where(....).ToArrary());
ทางเลือกที่ถูกต้องขึ้นอยู่กับว่าสตริงที่ป้อนเข้ามีขนาดใหญ่เพียงใดและข้อกำหนดด้านการบังคับใช้และหน่วยความจำคืออะไร แต่ฉันจะใช้นิพจน์ทั่วไปเช่น
string result = Regex.Replace(s, @"\r\n?|\n|\t", String.Empty);
หรือถ้าเราจำเป็นต้องใช้การแทนที่แบบเดิมหลายครั้งมันจะดีกว่าถ้าใช้รุ่นที่คอมไพล์แล้วสำหรับ Regex เช่น
var regex = new Regex(@"\r\n?|\n|\t", RegexOptions.Compiled);
string result = regex.Replace(s, String.Empty);
หมายเหตุ: สถานการณ์ที่แตกต่างกันต้องการวิธีการที่แตกต่างกันเพื่อให้ได้ประสิทธิภาพที่ดีที่สุดและการใช้หน่วยความจำขั้นต่ำ
ฉันอยากให้คุณเข้าใจพื้นที่ที่เฉพาะเจาะจงมากขึ้น \t
จริง ๆ แล้วสารพันเป็นพื้นที่แนวนอนไม่ใช่พื้นที่แนวตั้ง (ทดสอบการแทรก\t
ใน Notepad)
ถ้าคุณใช้ Java \v
เพียงแค่ใช้ ดูการอ้างอิงด้านล่าง
\h
- อักขระช่องว่างแนวนอน:
[\t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]
\v
- อักขระช่องว่างแนวตั้ง:
[\n\x0B\f\r\x85\u2028\u2029]
แต่ฉันรู้ว่าคุณใช้. NET ดังนั้นคำตอบของฉันที่จะแทนที่ทุกพื้นที่แนวตั้งคือ ..
string replacement = Regex.Replace(s, @"[\n\u000B\u000C\r\u0085\u2028\u2029]", "");
คุณสามารถใช้Trim
หากคุณต้องการลบตั้งแต่เริ่มต้นและสิ้นสุด
string stringWithoutNewLine = "\n\nHello\n\n".Trim();
FYI,
Trim () ทำเช่นนั้นแล้ว
ตัวอย่าง LINQPad ต่อไปนี้:
void Main()
{
var s = " \rsdsdsdsd\nsadasdasd\r\n ";
s.Length.Dump();
s.Trim().Length.Dump();
}
ขาออก:
23
18