Cách dễ nhất trong C # để cắt bớt dòng mới của một chuỗi là gì?


115

Tôi muốn đảm bảo rằng _content không kết thúc bằng ký tự NewLine:

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

nhưng đoạn mã trên không hoạt động vì Trim dường như không có tham số quá tải cho tập hợp các chuỗi, chỉ có các ký tự.

Cách đơn giản nhất để loại bỏ Enivronment.Newline khỏi phần cuối của một chuỗi là gì?


4
btw, bạn có thể muốn TrimEnd
Marc Gravell

Câu trả lời:


260

Những điều sau đây làm việc cho tôi.

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

hoặc là

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

rất súc tích và giao dịch với \ r \ n vấn đề, đẹp
Edward Tanguay

1
Trong khi việc cắt bỏ BẤT KỲ tổ hợp ký tự nào tạo nên (các) ký tự dòng mới không giải quyết được vấn đề cơ bản và tinh thần của câu hỏi, nó cũng để lại khả năng xảy ra chức năng không mong muốn theo nghĩa chung. Trong một senario xử lý tệp, tôi có thể thấy cần phải giữ nguyên \ n đầu tiên trong chuỗi HeresALineForUnixToBeFedFromWindows \ n \ r \ n. Trong khi tiết hơn, câu trả lời John Skeet có lẽ là tốt nhất và ReadLine Scott Weinstein cũng là nhiều hơn "chính xác" (mặc dù có lẽ với một chút chi phí hơn)
b_levitt

26
TrimEnd () đã thực hiện Công việc mà không có bất kỳ Tham số nào! msdn.microsoft.com/de-de/library/…msdn.microsoft.com/de-de/library/…
Markus

3
@Markus Cảm ơn tôi đã tìm thấy điều này vì tôi không muốn hành vi này nhưng đã trải qua nó. Tôi có ấn tượng rằng \ n không phải là khoảng trắng nhưng nó là và .TrimEnd và .Trim xóa tất cả các ký tự khoảng trắng một cách nguyên bản
David Carrigan

39

.Trim()loại bỏ \r\ncho tôi (sử dụng .NET 4.0).


14

Làm thế nào về:

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

Nó hơi kém hiệu quả nếu có nhiều dòng mới, nhưng nó sẽ hoạt động.

Ngoài ra, nếu bạn không bận tâm về việc cắt tỉa (nói) "\r\r\r\r"hoặc "\n\n\n\n"thay vì chỉ "\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
Có lẽ là giải pháp chính xác nhất, nhưng không phải là giải pháp duy nhất :-)
bang

9

Sử dụng Khung. Phương thức ReadLine () có nội dung sau:

Một dòng được định nghĩa là một chuỗi các ký tự được theo sau bởi một nguồn cấp dòng ("\ n"), một dấu xuống dòng ("\ r") hoặc một dấu xuống dòng ngay sau một nguồn cấp dòng ("\ r \ n"). Chuỗi được trả về không chứa ký tự xuống dòng kết thúc hoặc nguồn cấp dữ liệu dòng.

Vì vậy, sau đây sẽ làm thủ thuật

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

1
Thanh lịch có, nhưng không dễ hiểu đối với những người khác đọc dòng này. Cần một bình luận giải thích (trong cùng một dòng dĩ nhiên vẫn còn một lớp lót :))
Gumo

1
Không khi chuỗi có nhiều hơn một dòng và bạn chỉ muốn xóa dòng trống cuối cùng.
Florian Berger

6

Thế còn

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

Điều đó không hoàn toàn tương tự - ví dụ: nó sẽ cắt "abc \ n \ n \ n \ n \ n", ngay cả khi Environment.NewLine là crlf
Marc Gravell

1
Khai báo nó như một tính năng :-) Tôi thích giải pháp.
Stefan Steinegger

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

Điều này tất nhiên sẽ xóa "\ r \ r \ r \ r" cũng như "\ n \ n \ n \ n" và các kết hợp khác. Và trong "enviroments" nơi NewLine khác với "\ n \ r", bạn có thể nhận được một số hành vi lạ :-)

Nhưng nếu bạn có thể sống với điều này thì tôi tin rằng đây là cách hiệu quả nhất để xóa các ký tự dòng mới ở cuối chuỗi.


3

Làm thế nào về chỉ:

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

Điều đó sẽ kéo tất cả các ký tự khoảng trắng từ cuối chuỗi - chỉ có vấn đề nếu bạn muốn duy trì khoảng trắng không phải dòng mới.


1

Phần nào đó không phải là câu trả lời, nhưng cách dễ nhất để cắt bớt dòng mới của một chuỗi là không để dòng mới trên chuỗi ngay từ đầu, bằng cách đảm bảo rằng mã của bạn không bao giờ nhìn thấy nó. Đó là, bằng cách sử dụng các hàm gốc loại bỏ dòng mới. Nhiều phương thức luồng và tệp / io sẽ không bao gồm dòng mới nếu bạn yêu cầu xuất từng dòng, mặc dù có thể cần phải bọc một cái gì đó trongSystem.IO.BufferedStream .

Những thứ như System.IO.File.ReadAllLinescó thể được sử dụng thay thế cho System.IO.File.ReadAllTexthầu hết thời gian và ReadLinecó thể được sử dụng thay vì Readkhi bạn đang làm việc với đúng loại luồng (ví dụ BufferedStream).


0

Như Markus đã chỉ ra TrimEnd đang thực hiện công việc ngay bây giờ. Tôi cần lấy nguồn cấp dữ liệu dòng và khoảng trắng từ cả hai đầu chuỗi trong môi trường Windows Phone 7.8. Sau khi theo đuổi các tùy chọn phức tạp hơn khác nhau, vấn đề của tôi đã được giải quyết bằng cách chỉ sử dụng Trim () - đã vượt qua các bài kiểm tra sau một cách xuất sắc

   [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

Tôi đã phải xóa các dòng mới trên toàn bộ văn bản. Vì vậy, tôi đã sử dụng:

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

1
Đây sẽ là một thảm họa nếu văn bản chứa (các) NewLine không phải là cuối cùng.
Stefan Bergfeldt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.