วิธีลบอักขระบรรทัดใหม่ออกจากสตริงได้อย่างไร


181

ฉันมีสตริงในรูปแบบต่อไปนี้

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'});แต่ก็ไม่ได้ช่วยอะไร

คำตอบ:


321

ฉันชอบที่จะใช้การแสดงออกปกติ ในกรณีนี้คุณสามารถทำได้:

string replacement = Regex.Replace(s, @"\t|\n|\r", "");

นิพจน์ทั่วไปไม่ได้รับความนิยมในโลก. NET เหมือนกับภาษาไดนามิก แต่มีพลังมากมายในการจัดการสตริง


นี่เป็นทางออกที่ดีที่สุดสำหรับฉันอย่างแน่นอน การผสมผสานที่ราบรื่นของ C # นี้และจาวาสคริปต์คือทั้งหมดที่ฉันต้องการเพื่อแก้ไขปัญหาของฉัน
Joe Brunscheon

ฉันมีปัญหาที่คล้ายกันซึ่งฉันต้องการเพื่อลบบรรทัดใหม่จากสาย ฉันพยายามที่จะทำมันด้วยสตริงแทนที่ไม่ทำงาน เมื่อฉันใช้ Regex.Replace ด้วยสตริงนิพจน์ปกติที่แน่นอนเหมือนกันกับพารามิเตอร์มันใช้งานได้ ขอบคุณ
instanceof

8
ระวังหากใช้สิ่งนี้ในลูปที่ประมวลผล 1M + รายการ Regex ช้ากว่าแค่ String แทนที่
Nick

ตัวอย่างรหัสยังลบแท็บ \ t ซึ่งไม่ได้เป็นปัญหา
Michael Freidgeim

71

คุณต้องการใช้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();
}

8
โปรดทราบว่าวิธีการนี้จะสร้างวัตถุสตริงกลางสองรายการ ขึ้นอยู่กับขนาดของสตริงของคุณสิ่งนี้อาจส่งผลต่อประสิทธิภาพและการใช้หน่วยความจำที่สำคัญ
cdhowie

40

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ฉันคิดว่าฉันจะแบ่งปันวิธีที่ฉันใช้เพื่อลบอักขระบรรทัดใหม่

s.Replace(Environment.NewLine, "");

อ้างอิง:

MSDN String.Replace วิธีการและคุณสมบัติ MSDN Environment.NewLine


ดีสำหรับการสนับสนุนโมโน
Nick

1
ในแอปพลิเคชันข้ามสภาพแวดล้อม (เช่นแอพ Windows ที่ฟีดด้วยข้อมูลจากระบบ Unix) สิ่งนี้จะทำให้เกิดปัญหามากกว่าผลกำไร
Jakub Szułakiewicz

15

หากความเร็วและการใช้หน่วยความจำต่ำมีความสำคัญให้ทำสิ่งนี้:

var sb = new StringBuilder(s.Length);

foreach (char i in s)
    if (i != '\n' && i != '\r' && i != '\t')
        sb.Append(i);

s = sb.ToString();

ใช่ฉันจะไปด้วยเช่นกัน (ในวิธีการขยาย) ดีเสมอที่จะใช้ StringBuilder +1
RPM1984

4
"ดีเสมอที่จะใช้ StringBuilder" <ฉันไม่ใช่มืออาชีพ แต่นั่นไม่จริงอย่างแน่นอน นี้บทความโดยเจฟฟ์แอดให้ข้อมูลเชิงลึกสนุกเป็นสตริงการจัดการ / การเรียงต่อกันและท้ายที่สุดการเพิ่มประสิทธิภาพ
Phil Cooper


3

แนวทาง 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'));

1
นี่คือการใช้เกินพิกัดทั่วไปของstring.Joinที่จะเรียกร้องToStringในแต่ละcharคืนโดยแบบสอบถาม ดีกว่าที่จะเพียงส่งผลลัพธ์แบบสอบถามไปยังตัวstringสร้าง s1 = new string(s.Where(....).ToArrary());
juharr

0

ทางเลือกที่ถูกต้องขึ้นอยู่กับว่าสตริงที่ป้อนเข้ามีขนาดใหญ่เพียงใดและข้อกำหนดด้านการบังคับใช้และหน่วยความจำคืออะไร แต่ฉันจะใช้นิพจน์ทั่วไปเช่น

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

หมายเหตุ: สถานการณ์ที่แตกต่างกันต้องการวิธีการที่แตกต่างกันเพื่อให้ได้ประสิทธิภาพที่ดีที่สุดและการใช้หน่วยความจำขั้นต่ำ


0

ฉันอยากให้คุณเข้าใจพื้นที่ที่เฉพาะเจาะจงมากขึ้น \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]", "");

ดูเหมือนว่าจะมีคำตอบสำหรับคำถามอื่น ๆ ... และยังขาดการอ้างอิงจริง ...
Alexei Levenkov

-4

คุณสามารถใช้Trimหากคุณต้องการลบตั้งแต่เริ่มต้นและสิ้นสุด

string stringWithoutNewLine = "\n\nHello\n\n".Trim();

-6

FYI,

Trim () ทำเช่นนั้นแล้ว

ตัวอย่าง LINQPad ต่อไปนี้:

void Main()
{
    var s = " \rsdsdsdsd\nsadasdasd\r\n ";
    s.Length.Dump();
    s.Trim().Length.Dump();
}

ขาออก:

23
18

5
ไม่ได้ลบ \ n ที่อยู่ตรงกลาง
FlappySocks
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.