วิธีใดเป็นวิธีที่ง่ายที่สุดใน C # ในการตัดสตริงขึ้นบรรทัดใหม่


115

ฉันต้องการตรวจสอบให้แน่ใจว่า _content ไม่ได้ลงท้ายด้วยอักขระ NewLine:

_content = sb.ToString().Trim(new char[] { Environment.NewLine });

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

บรรทัดเดียวที่ง่ายที่สุดในการลบ Enivronment Newline จากจุดสิ้นสุดของสตริงคืออะไร


4
btw คุณอาจต้องการ TrimEnd
Marc Gravell

คำตอบ:


260

ต่อไปนี้ใช้ได้ผลสำหรับฉัน

sb.ToString().TrimEnd( '\r', '\n' );

หรือ

sb.ToString().TrimEnd( Environment.NewLine.ToCharArray());

กระชับมากและเกี่ยวข้องกับปัญหา \ r \ n ดี
Edward Tanguay

1
ในขณะที่การตัดแต่งชุดอักขระใด ๆ ที่ประกอบขึ้นเป็นอักขระบรรทัดใหม่จะช่วยแก้ปัญหาพื้นฐานและจิตวิญญาณของคำถาม แต่ก็ยังทิ้งโอกาสในการใช้งานที่ไม่ต้องการในแง่ทั่วไป ใน Senario การประมวลผลไฟล์ฉันเห็นว่าจำเป็นต้องปล่อยให้ \ n ตัวแรกไม่บุบสลายในสตริงของ HeresALineForUnixToBeFedFedFromWindows \ n \ r \ n แม้ว่าจะมีรายละเอียดมากขึ้น แต่คำตอบของ John Skeet ก็น่าจะดีที่สุดและ ReadLine ของ Scott Weinstein ก็ "แม่นยำกว่า" เช่นกัน (แม้ว่าอาจจะมีค่าใช้จ่ายมากกว่าเล็กน้อย)
b_levitt

26
TrimEnd () กำลังทำงานโดยไม่มีพารามิเตอร์ใด ๆ ! msdn.microsoft.com/de-de/library/…และmsdn.microsoft.com/de-de/library/…
Markus

3
@Markus ขอบคุณที่ฉันพบสิ่งนี้เพราะฉันไม่ต้องการพฤติกรรมนี้ แต่กำลังประสบอยู่ ฉันอยู่ภายใต้ความประทับใจ \ n ไม่ใช่พื้นที่สีขาว แต่เป็นและ. TrimEnd และ. Trim ล้างอักขระช่องว่างสีขาวทั้งหมดโดยกำเนิด
David Carrigan


14

เกี่ยวกับ:

public static string TrimNewLines(string text)
{
    while (text.EndsWith(Environment.NewLine))
    {
        text = text.Substring(0, text.Length - Environment.NewLine.Length);
    }
    return text;
}

ค่อนข้างไม่มีประสิทธิภาพหากมีบรรทัดใหม่หลายรายการ แต่จะใช้งานได้

อีกทางเลือกหนึ่งหากคุณไม่รังเกียจที่จะตัดแต่ง (พูด) "\r\r\r\r"หรือ"\n\n\n\n"มากกว่าแค่"\r\n\r\n\r\n":

// No need to create a new array each time
private static readonly char[] NewLineChars = Environment.NewLine.ToCharArray();

public static string TrimNewLines(string text)
{
    return text.TrimEnd(NewLineChars);
}

1
อาจเป็นวิธีแก้ปัญหาที่ถูกต้องที่สุด แต่ไม่ใช่ :-)
บางซื่อ

9

ใช้ Framework วิธี ReadLine () มีดังต่อไปนี้ที่จะพูด:

บรรทัดถูกกำหนดให้เป็นลำดับของอักขระตามด้วยฟีดบรรทัด ("\ n"), การกลับแคร่ ("\ r") หรือการกลับแคร่ตามด้วยฟีดบรรทัดทันที ("\ r \ n") สตริงที่ส่งคืนไม่มีการยกเลิกการส่งคืนค่าขนส่งหรือฟีดบรรทัด

ต่อไปนี้จะทำเคล็ดลับ

_content = new StringReader(sb.ToString()).ReadLine();

1
หรูหราใช่ แต่ไม่ใช่เรื่องง่ายที่จะเข้าใจสำหรับคนอื่นที่อ่านบรรทัดนี้ ต้องการความคิดเห็นอธิบาย (ในบรรทัดเดียวกันจะยังคงเป็นหนึ่งซับ :))
gumo

1
ไม่ใช่เมื่อสตริงมีมากกว่าหนึ่งบรรทัดและคุณต้องการลบบรรทัดว่างสุดท้ายเท่านั้น
Florian Berger

6

แล้ว

_content = sb.ToString().Trim(Environment.NewLine.ToCharArray());

แต่นั่นไม่ได้ทำค่อนข้างสิ่งเดียวกัน - มันจะตัด "abc \ n \ n \ n \ n \ n" ตัวอย่างเช่นแม้ว่า Environment.NewLine เป็น CRLF
Marc Gravell

1
ประกาศว่าเป็นคุณลักษณะ :-) ฉันชอบวิธีแก้ปัญหา
Stefan Steinegger

5
_content = sb.TrimEnd(Environment.NewLine.ToCharArray());

แน่นอนว่าจะเป็นการลบ "\ r \ r \ r \ r" รวมทั้ง "\ n \ n \ n \ n" และชุดค่าผสมอื่น ๆ และใน "สภาพแวดล้อม" ที่ NewLine ไม่ใช่ "\ n \ r" คุณอาจได้รับพฤติกรรมแปลก ๆ :-)

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


3

แล้วแค่:

string text = sb.ToString().TrimEnd(null)

ซึ่งจะดึงอักขระเว้นวรรคทั้งหมดจากท้ายสตริง - จะเป็นปัญหาเฉพาะในกรณีที่คุณต้องการสงวนช่องว่างที่ไม่ใช่การขึ้นบรรทัดใหม่


1

ค่อนข้างเป็นคำตอบ แต่วิธีที่ง่ายที่สุดในการตัดการขึ้นบรรทัดใหม่ออกจากสตริงคือการไม่มีขึ้นบรรทัดใหม่ในสตริงตั้งแต่แรกโดยตรวจสอบให้แน่ใจว่าโค้ดของคุณไม่เคยเห็น นั่นคือโดยใช้ฟังก์ชันดั้งเดิมซึ่งลบบรรทัดใหม่ วิธีการสตรีมและไฟล์ / io จำนวนมากจะไม่รวมขึ้นบรรทัดใหม่หากคุณขอเอาต์พุตทีละบรรทัดแม้ว่าอาจจำเป็นต้องรวมบางอย่างในไฟล์System.IO.BufferedStream.

สิ่งต่างๆเช่นSystem.IO.File.ReadAllLinesสามารถใช้แทนSystem.IO.File.ReadAllTextเวลาได้เกือบตลอดเวลาและReadLineสามารถใช้แทนReadเมื่อคุณทำงานกับสตรีมประเภทที่ถูกต้อง (เช่นBufferedStream)


0

ดังที่ Markus ชี้ให้เห็นว่า TrimEnd กำลังทำงานอยู่ในขณะนี้ ฉันต้องการรับฟีดบรรทัดและพื้นที่สีขาวจากปลายทั้งสองด้านของสตริงในสภาพแวดล้อม Windows Phone 7.8 หลังจากไล่ตามตัวเลือกที่ซับซ้อนมากขึ้นปัญหาของฉันได้รับการแก้ไขโดยใช้ Trim () เท่านั้น - ผ่านการทดสอบต่อไปนี้อย่างดี

   [TestMethod]
    [Description("TrimNewLines tests")]
    public void Test_TrimNewLines()
    {
        Test_TrimNewLines_runTest("\n\r     testi    \n\r", "testi");
        Test_TrimNewLines_runTest("\r     testi    \r", "testi");
        Test_TrimNewLines_runTest("\n     testi    \n", "testi");
        Test_TrimNewLines_runTest("\r\r\r\r\n\r     testi   \r\r\r\r \n\r", "testi");
        Test_TrimNewLines_runTest("\n\r  \n\n\n\n   testi äål.,    \n\r", "testi äål.,");
        Test_TrimNewLines_runTest("\n\n\n\n     testi  ja testi  \n\r\n\n\n\n", "testi  ja testi");
        Test_TrimNewLines_runTest("", "");
        Test_TrimNewLines_runTest("\n\r\n\n\r\n", "");
        Test_TrimNewLines_runTest("\n\r \n\n \n\n", "");
    }

    private static void Test_TrimNewLines_runTest(string _before, string _expected)
    {
        string _response = _before.Trim();
        Assert.IsTrue(_expected == _response, "string '" + _before + "' was translated to '" + _response + "' - should have been '" + _expected + "'");
    }

-2

ฉันต้องลบบรรทัดใหม่บนข้อความทั้งหมด ดังนั้นฉันจึงใช้:

            while (text.Contains(Environment.NewLine))
            {
                text = text.Substring(0, text.Length - Environment.NewLine.Length);
            }

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