Thay thế ngắt dòng trong chuỗi C #


512

Làm cách nào tôi có thể thay thế Line Breaks trong một chuỗi trong C #?


2
Xin vui lòng cho chúng tôi biết thêm: "ngắt dòng" với bạn là gì? Bạn muốn thay thế chúng bằng gì?
Jay Bazuzi

ha ha. Tôi đã kiểm tra tương tự trong java khi tôi phát hiện System.getProperty ("line.separator") là sự tò mò muốn biết đối tác trong C #. bài viết của bạn đã giúp tôi.
Ravisha

Câu trả lời:


715

Sử dụng thay thế bằng Environment.NewLine

myString = myString.Replace(System.Environment.NewLine, "replacement text"); //add a line terminating ;

Như đã đề cập trong các bài đăng khác, nếu chuỗi đến từ môi trường khác (HĐH) thì bạn cần thay thế việc thực hiện các môi trường cụ thể đó của các ký tự điều khiển dòng mới .


8
Đầu tiên nó không làm việc cho tôi. Sau một số nghiên cứu, tôi tìm thấy giải pháp: Tôi phải sử dụng 'bằng cách sử dụng Hệ thống;' hoặc 'System.En
Môi trường.NewLine

12
Không loại bỏ tất cả các ký tự dòng mới. Hãy thử chuỗi này "\ n \ r \ n Tin nhắn của tôi \ r \ n \ n \ r \ n là đây. \ N \ n \ r \ n"
Shakti Prakash Singh

13
Nói chung, tôi thích giải pháp này. Tuy nhiên, lưu ý rằng ngay cả trên cùng một hệ điều hành, các dòng mới thực tế có thể không khớp. Điều này xảy ra với tôi tại sao xử lý trả lại SQL. Các dòng mới là \ n, trong khi Môi trường.NewLine là \ r \ n. Kết quả là không có gì phù hợp nên các dòng mới vẫn còn.
Dono

@Dono> dữ liệu SQL đến từ đâu? Có lẽ từ một nguồn bên ngoài xử lý các dòng mới theo cách UNIX. Đó là một vấn đề với định dạng dữ liệu, không phải với hệ điều hành hay phương pháp này ...
Laurent S.

Đây phải là một trong các phương thức tĩnh của lớp String. Bản thân .NET sẽ có thể phát hiện định dạng ngắt dòng nguồn trong một chuỗi và chuyển đổi nó thành môi trường.NewLine \ r \ n ...
Dean Kuga

442

Các giải pháp được đăng cho đến nay chỉ thay thế Environment.NewLinehoặc chúng thất bại nếu chuỗi thay thế chứa ngắt dòng vì chúng gọi string.Replacenhiều lần.

Đây là một giải pháp sử dụng biểu thức chính quy để thực hiện cả ba thay thế chỉ trong một lần vượt qua chuỗi. Điều này có nghĩa là chuỗi thay thế có thể chứa ngắt dòng một cách an toàn.

string result = Regex.Replace(input, @"\r\n?|\n", replacementString);

3
vì vậy, câu nói của bạn khi thực hiện Regex.Replace (input, @ "[\ r \ n] +", thay thếString) sẽ không hoàn thành nhiệm vụ tương tự?
flamebaud

7
@flamebaud Không, điều đó sẽ tạo ra một kết quả khác nếu có nhiều ngắt dòng liên tiếp. "\ r \ n? | \ n" sẽ thay thế từng ngắt dòng trong khi "[\ r \ n] +" sẽ thực hiện thay thế một lần cho bất kỳ số lần ngắt dòng nào.
David Hammond

Đối với những người lo lắng về việc ngắt nhiều dòng: / (\ r \ n? | \ N) / gm
BobbyA

4
Đây thực sự là giải pháp chính xác nếu bạn muốn loại bỏ ngắt dòng trong một chuỗi có thể đến từ các hệ điều hành khác nhau. Ví dụ điển hình là định dạng JSON. +1
Bastien Vandamme

1
Nếu chuỗi nguyên văn (@ tiền tố) không được sử dụng, thì bạn sẽ cần phải có hai dấu gạch chéo ngược trong một hàng ở mọi nơi nó được sử dụng, vì vậy câu trả lời của @mark_byers ở trên vẫn đúng. Tiền tố @ làm cho nó sao cho dấu gạch chéo ngược là một phần của chuỗi mà Regex phải sử dụng nó làm ký tự thoát.
Kirk Liêmohn

173

Để mở rộng câu trả lời của The.Anyi.9, bạn cũng nên biết về các loại ngắt dòng khác nhau trong sử dụng chung . Phụ thuộc vào nơi tệp của bạn bắt nguồn, bạn có thể muốn xem xét để đảm bảo rằng bạn nắm bắt được tất cả các lựa chọn thay thế ...

string replaceWith = "";
string removedBreaks = Line.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);

sẽ đưa bạn đi ...


6
Đầu tiên tôi thích môi trường tốt hơn, nhưng nếu String không xuất phát từ hệ thống, nó sẽ không hoạt động. +1
Flo

1
không Line.Replace("\n", replaceWith).Replace("\r", replaceWith);đủ sao?
Thomas Ayoub

5
Không, bởi vì nếu bạn có, \r\nbạn sẽ kết thúc chuỗi thay thế hai lần - không lý tưởng.
ZombieSheep

1
Bạn không cần chuỗi ký tự? chuỗi removeBreaks = Line.Replace (@ "\ r \ n", thay thếWith) .Replace (@ "\ n", thay thếWith) .Replace (@ "\ r", thayWith);
Shawn Dotey

2
@ShawnDotey không cần, chúng tôi muốn thay thế các ký tự điều khiển, không phải chuỗi các dấu gạch chéo ngược và chữ cái.
N. Kudryavtsev

38

Tôi sẽ sử dụng Môi trường.Newline khi tôi muốn chèn một dòng mới cho một chuỗi, nhưng không xóa tất cả các dòng mới khỏi một chuỗi.

Tùy thuộc vào nền tảng của bạn, bạn có thể có các loại dòng mới khác nhau, nhưng ngay cả trong cùng một nền tảng thường sử dụng các loại dòng mới khác nhau. Đặc biệt khi xử lý các định dạng tập tin và giao thức.

string ReplaceNewlines(string blockOfText, string replaceWith)
{
    return blockOfText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}

Đây là điều duy nhất làm việc cho tôi khi tôi muốn thu gọn mã trang web đã truy xuất thành một dòng duy nhất (để làm cho các mẫu biểu thức chính quy dễ dàng hơn).
Paw Baltzersen

Hoàn toàn đồng ý với Brian R. Bondy. Giải pháp được cung cấp bởi Corin và được nâng cấp rất nhiều là rất ngây thơ, ít nhất.
Califf

18

Nếu mã của bạn được cho là chạy trong các môi trường khác nhau, tôi sẽ xem xét sử dụng Environment.NewLinehằng số, vì nó đặc biệt newlineđược sử dụng trong môi trường cụ thể.

line = line.Replace(Environment.NewLine, "newLineReplacement");

Tuy nhiên, nếu bạn nhận được văn bản từ một tệp có nguồn gốc trên một hệ thống khác, đây có thể không phải là câu trả lời chính xác và bạn nên thay thế bằng bất kỳ hằng số dòng mới nào được sử dụng trên hệ thống khác. Nó thường sẽ \nhoặc \r\n.


Bạn cần gán lại nó cho biến ban đầu vì sự thay thế không xảy ra.
tvanfosson

@driss Tôi muốn biết làm thế nào bạn sẽ chọn một dòng mới đúng khi bạn không biết một tập tin đến từ hệ thống nào ... giải pháp này thực sự có vẻ là ĐẠI HỌC.
Califf

14

Đừng quên rằng thay thế không thực hiện thay thế trong chuỗi, nhưng trả về một chuỗi mới với các ký tự được thay thế. Sau đây sẽ loại bỏ ngắt dòng (không thay thế chúng). Tôi sẽ sử dụng phương pháp @Brian R. Bondy nếu thay thế chúng bằng một thứ khác, có lẽ được gói như một phương thức mở rộng. Hãy nhớ kiểm tra giá trị null trước khi gọi Thay thế hoặc các phương thức mở rộng được cung cấp.

string line = ...

line = line.Replace( "\r", "").Replace( "\n", "" );

Là phương pháp mở rộng:

public static class StringExtensions
{
   public static string RemoveLineBreaks( this string lines )
   {
      return lines.Replace( "\r", "").Replace( "\n", "" );
   }

   public static string ReplaceLineBreaks( this string lines, string replacement )
   {
      return lines.Replace( "\r\n", replacement )
                  .Replace( "\r", replacement )
                  .Replace( "\n", replacement );
   }
}

không thể có ''trong C # - không có thứ gọi là char trống. sẽ '\0'làm việc thay thế?
Shevek

1
@Shevek - chỉ sử dụng các trích dẫn sai. Phải có một số lượng khá lớn javascript vào ngày tôi trả lời điều này.
tvanfosson

@Califf - nó tương đương, không tốt hơn.
tvanfosson

2
sai lầm bạn đã làm ở đây chỉ chứng tỏ nó tốt hơn. Hầu hết các công ty tôi làm việc đều có tiêu chuẩn mã hóa của họ - KHÔNG SỬ DỤNG LITITHS HARDCODED.
Califf

2
@Califf "lỗi" tôi đã làm sẽ không được tạo ra trong một IDE với Intellisense và nó cũng sẽ không được biên dịch. Nếu bạn cảm thấy điều đó string.Emptytốt hơn, bằng mọi cách hãy sử dụng nó.
tvanfosson

10

Để đảm bảo tất cả các cách ngắt dòng có thể (Windows, Mac và Unix) được thay thế, bạn nên sử dụng:

string.Replace("\r\n", "\n").Replace('\r', '\n').Replace('\n', 'replacement');

và theo thứ tự này, để không tạo thêm ngắt dòng, khi bạn tìm thấy một số kết hợp của ký tự kết thúc dòng.


8

Nếu bạn muốn "dọn dẹp" các dòng mới, bình luận flamebaud bằng regex @"[\r\n]+"là lựa chọn tốt nhất.

using System;
using System.Text.RegularExpressions;

class MainClass {
  public static void Main (string[] args) {
    string str = "AAA\r\nBBB\r\n\r\n\r\nCCC\r\r\rDDD\n\n\nEEE";

    Console.WriteLine (str.Replace(System.Environment.NewLine, "-"));
    /* Result:
    AAA
    -BBB
    -
    -
    -CCC


    DDD---EEE
    */
    Console.WriteLine (Regex.Replace(str, @"\r\n?|\n", "-"));
    // Result:
    // AAA-BBB---CCC---DDD---EEE

    Console.WriteLine (Regex.Replace(str, @"[\r\n]+", "-"));
    // Result:
    // AAA-BBB-CCC-DDD-EEE
  }
}

Câu trả lời tốt nhất để thay thế các dòng mới, trong hầu hết các trường hợp.
Shahbaz Ahmad

Cảm ơn mã mẫu hữu ích này. Tôi đã sửa lỗi thông qua sytnax này: Regex.Replace (str, @ "[\ r \ n] +", "-")
Sedat Kumcu

6

Tôi cần phải thay thế \r\nbằng trả lại vận chuyển thực tế và nguồn cấp dữ liệu và thay thế \tbằng một tab thực tế. Vì vậy, tôi đã đưa ra những điều sau đây:

public string Transform(string data)
{
    string result = data;
    char cr = (char)13;
    char lf = (char)10;
    char tab = (char)9;

    result = result.Replace("\\r", cr.ToString());
    result = result.Replace("\\n", lf.ToString());
    result = result.Replace("\\t", tab.ToString());

    return result;
}

6

Tại sao không phải cả hai?

string ReplacementString = "";

Regex.Replace(strin.Replace(System.Environment.NewLine, ReplacementString), @"(\r\n?|\n)", ReplacementString);

Lưu ý: Thay thế strinbằng tên của chuỗi đầu vào của bạn.



2

Sử dụng phương thức .Replace ()

Line.Replace("\n", "whatever you want to replace with");

2

Cách tốt nhất để thay thế ngắt dòng an toàn là

yourString.Replace("\r\n","\n") //handling windows linebreaks
.Replace("\r","\n")             //handling mac linebreaks

sẽ tạo ra một chuỗi chỉ có \ n (ví dụ: linefeed) dưới dạng ngắt dòng. mã này cũng hữu ích để sửa lỗi ngắt dòng hỗn hợp.


2

Vì dòng mới có thể được phân định bởi \n, \r\r\n, trước tiên chúng ta sẽ thay thế \r\r\nbằng \n, và chỉ sau đó phân tách chuỗi dữ liệu.

Các dòng sau nên đi đến parseCSVphương thức:

function parseCSV(data) {
    //alert(data);
    //replace UNIX new lines
    data = data.replace(/\r\n/g, "\n");
    //replace MAC new lines
    data = data.replace(/\r/g, "\n");
    //split into rows
    var rows = data.split("\n");
}

0
string s = Regex.Replace(source_string, "\n", "\r\n");

hoặc là

string s = Regex.Replace(source_string, "\r\n", "\n");

tùy thuộc vào con đường bạn muốn đi

Hy vọng nó sẽ giúp.


0

Một lựa chọn khác là tạo ra một StringReaderchuỗi trong câu hỏi. Trên đầu đọc, làm .ReadLine()trong một vòng lặp. Sau đó, bạn có các dòng riêng biệt, bất kể phân tách (nhất quán hoặc không nhất quán) họ có. Với điều đó, bạn có thể tiến hành như bạn muốn; một khả năng là sử dụng một StringBuildervà gọi .AppendLinenó.

Ưu điểm là, bạn để khung quyết định cái gì tạo thành "ngắt dòng".


0

Nếu bạn chỉ muốn thay thế các dòng mới:

var input = @"sdfhlu \r\n sdkuidfs\r\ndfgdgfd";
var match = @"[\\ ]+";
var replaceWith = " ";
Console.WriteLine("input: " + input);
var x = Regex.Replace(input.Replace(@"\n", replaceWith).Replace(@"\r", replaceWith), match, replaceWith);
Console.WriteLine("output: " + x);

Nếu bạn muốn thay thế dòng mới, tab và khoảng trắng:

var input = @"sdfhlusdkuidfs\r\ndfgdgfd";
var match = @"[\\s]+";
var replaceWith = "";
Console.WriteLine("input: " + input);
var x = Regex.Replace(input, match, replaceWith);
Console.WriteLine("output: " + x);
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.