Làm cách nào tôi có thể thay thế Line Breaks trong một chuỗi trong C #?
Làm cách nào tôi có thể thay thế Line Breaks trong một chuỗi trong C #?
Câu trả lời:
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 .
Các giải pháp được đăng cho đến nay chỉ thay thế Environment.NewLine
hoặ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.Replace
nhiề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);
Để 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 ...
Line.Replace("\n", replaceWith).Replace("\r", replaceWith);
đủ sao?
\r\n
bạn sẽ kết thúc chuỗi thay thế hai lần - không lý tưởng.
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);
}
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.NewLine
hằ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ẽ \n
hoặc \r\n
.
Đừ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 );
}
}
''
trong C # - không có thứ gọi là char trống. sẽ '\0'
làm việc thay thế?
string.Empty
tốt hơn, bằng mọi cách hãy sử dụng nó.
Để đả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.
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
}
}
Tôi cần phải thay thế \r\n
bằng trả lại vận chuyển thực tế và nguồn cấp dữ liệu và thay thế \t
bằ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;
}
var answer = Regex.Replace(value, "(\n|\r)+", replacementString);
Vì dòng mới có thể được phân định bởi \n
, \r
và \r\n
, trước tiên chúng ta sẽ thay thế \r
và \r\n
bằng \n
, và chỉ sau đó phân tách chuỗi dữ liệu.
Các dòng sau nên đi đến parseCSV
phươ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");
}
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.
Một lựa chọn khác là tạo ra một StringReader
chuỗ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 StringBuilder
và gọi .AppendLine
nó.
Ưu điểm là, bạn để khung quyết định cái gì tạo thành "ngắt dòng".
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);