Làm thế nào để loại bỏ các ký tự dòng mới từ một chuỗi?


181

Tôi có một chuỗi ở định dạng sau

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'

Tôi muốn loại bỏ tất cả các lần xuất hiện \n\rtừ chuỗi trên.

Tôi đã cố gắng string s = s.Trim(new char[] {'\n', '\r'});nhưng nó không giúp được gì.

Câu trả lời:


321

Tôi thích sử dụng các biểu thức thông thường. Trong trường hợp này bạn có thể làm:

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

Các biểu thức chính quy không phổ biến trong thế giới .NET như trong các ngôn ngữ động, nhưng chúng cung cấp rất nhiều sức mạnh để thao tác các chuỗi.


Đây chắc chắn là giải pháp tốt nhất cho tôi. Một sự pha trộn mượt mà của C # và javascript này là tất cả những gì tôi cần để giải quyết vấn đề của mình.
Joe Brunscheon

Tôi đã có một vấn đề tương tự khi tôi cũng cần phải xóa dòng mới khỏi chuỗi của mình. Tôi đã cố gắng làm điều đó với chuỗi.Replace, không hoạt động. Khi tôi sử dụng Regex.Replace với chính xác chuỗi biểu thức chính quy như tham số, nó đã hoạt động. Cảm ơn.
ví dụ

8
Hãy cẩn thận nếu sử dụng điều này trong một vòng lặp xử lý các mục 1M +. Regex chậm hơn so với String.Replace
Nick

Ví dụ mã cũng xóa các tab \ t, không có vấn đề.
Michael Freidgeim

71

Bạn muốn sử dụng String.Replaceđể loại bỏ một nhân vật.

s = s.Replace("\n", String.Empty);
s = s.Replace("\r", String.Empty);
s = s.Replace("\t", String.Empty);

Lưu ý rằng String.Trim(params char[] trimChars)chỉ loại bỏ các ký tự đầu và cuối trong trimCharsví dụ được gọi trên.

Bạn có thể tạo một phương thức mở rộng để tránh các vấn đề về hiệu năng của việc tạo ra nhiều chuỗi tạm thời ở trên:

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
Lưu ý rằng phương pháp này sẽ tạo ra hai đối tượng chuỗi trung gian. Tùy thuộc vào kích thước chuỗi của bạn, điều này có thể có hậu quả đáng kể về hiệu suất và tiêu thụ bộ nhớ.
cdhowie

40

Tôi biết đây là một bài viết cũ, tuy nhiên tôi nghĩ tôi sẽ chia sẻ phương pháp tôi sử dụng để xóa các ký tự dòng mới.

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

Người giới thiệu:

Chuỗi MSDN. Phương thức đặt lạiMôi trường MSDN. Thuộc tính mới


rất vui khi được hỗ trợ Mono
Nick

1
Trong môi trường chéo (tức là ứng dụng Windows được cung cấp dữ liệu từ hệ thống Unix), điều này sẽ gây ra nhiều vấn đề hơn lợi nhuận.
Jakub Szułakiewicz

15

Nếu tốc độ và việc sử dụng bộ nhớ thấp là quan trọng, hãy làm một cái gì đó như thế này:

var sb = new StringBuilder(s.Length);

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

s = sb.ToString();

Vâng, tôi cũng sẽ làm điều này (trong một phương pháp mở rộng). Luôn luôn tốt để sử dụng StringBuilder. +1
RPM1984

4
"Luôn luôn tốt khi sử dụng StringBuilder" <Tôi không chuyên nghiệp, nhưng điều đó không hoàn toàn đúng. Bài viết này của Jeff Atwood cung cấp một cái nhìn sâu sắc thú vị về thao tác / nối chuỗi và cuối cùng là tối ưu hóa.
Phil Cooper

5

cứ làm đi

s = s.Replace("\n", String.Empty).Replace("\t", String.Empty).Replace("\r", String.Empty);

3

Cách tiếp cận 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
Điều này đang sử dụng quá tải chung string.Joinsẽ gọi ToStringcho mỗi chartruy vấn được trả về. Tốt hơn là chỉ truyền kết quả truy vấn cho hàm stringtạo. s1 = new string(s.Where(....).ToArrary());
juharr

0

Sự lựa chọn đúng thực sự phụ thuộc vào mức độ lớn của chuỗi đầu vào và yêu cầu về lực lượng và bộ nhớ là gì, nhưng tôi sẽ sử dụng một biểu thức chính quy như

string result = Regex.Replace(s, @"\r\n?|\n|\t", String.Empty);

Hoặc nếu chúng ta cần áp dụng cùng một thay thế nhiều lần, tốt hơn là sử dụng phiên bản được biên dịch cho Regex như

var regex = new Regex(@"\r\n?|\n|\t", RegexOptions.Compiled); 
string result = regex.Replace(s, String.Empty);

LƯU Ý: các kịch bản khác nhau yêu cầu các cách tiếp cận khác nhau để đạt được hiệu suất tốt nhất và mức tiêu thụ bộ nhớ tối thiểu


0

Chà ... tôi muốn bạn hiểu thêm các khu vực cụ thể của không gian. \tthực sự là các loại như một không gian ngang, không phải là một không gian dọc. (kiểm tra chèn \ttrong Notepad)

Nếu bạn sử dụng Java, chỉ cần sử dụng \v. Xem tài liệu tham khảo dưới đây.

\h - Một ký tự khoảng trắng ngang:

[\t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]

\v - Một ký tự khoảng trắng dọc:

[\n\x0B\f\r\x85\u2028\u2029]

Nhưng tôi biết rằng bạn sử dụng .NET. Vì vậy, câu trả lời của tôi để thay thế mọi không gian dọc là ..

string replacement = Regex.Replace(s, @"[\n\u000B\u000C\r\u0085\u2028\u2029]", "");

Có vẻ như một câu trả lời cho một số câu hỏi khác ... và cũng thiếu tham khảo thực tế ...
Alexei Levenkov

-4

Bạn có thể sử dụng Trimnếu bạn muốn loại bỏ từ đầu và cuối.

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

-6

FYI,

Trim () làm điều đó rồi.

Mẫu LINQPad sau:

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

Đầu ra:

23
18

5
Điều đó không loại bỏ \ n ở giữa.
FlappySocks
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.