Đây là câu trả lời cho câu hỏi này. Giải pháp đã cho thay thế một chuỗi bằng bảng dịch đã cho. Nó không sử dụng chức năng regex đắt tiền. Nó cũng không sử dụng nhiều chức năng thay thế mà mỗi cá nhân đã lặp qua dữ liệu với một số kiểm tra, v.v.
Vì vậy, tìm kiếm được thực hiện trực tiếp trong 1 cho vòng lặp. Đối với số lần công suất của mảng kết quả phải được tăng lên, một vòng lặp cũng được sử dụng trong hàm Array.Copy. Đó là tất cả các vòng lặp. Trong một số trường hợp, kích thước trang lớn hơn có thể hiệu quả hơn.
public static string NormalizeNewLine(this string val)
{
if (string.IsNullOrWhiteSpace(val))
return val;
const int page = 6;
int a = page;
int j = 0;
int len = val.Length;
char[] res = new char[len];
for (int i = 0; i < len; i++)
{
char ch = val[i];
if (ch == '\r')
{
int ni = i + 1;
if (ni < len && val[ni] == '\n')
{
res[j++] = '\r';
res[j++] = '\n';
i++;
}
else
{
if (a == page) //ensure capacity
{
char[] nres = new char[res.Length + page];
Array.Copy(res, 0, nres, 0, res.Length);
res = nres;
a = 0;
}
res[j++] = '\r';
res[j++] = '\n';
a++;
}
}
else if (ch == '\n')
{
int ni = i + 1;
if (ni < len && val[ni] == '\r')
{
res[j++] = '\r';
res[j++] = '\n';
i++;
}
else
{
if (a == page) //ensure capacity
{
char[] nres = new char[res.Length + page];
Array.Copy(res, 0, nres, 0, res.Length);
res = nres;
a = 0;
}
res[j++] = '\r';
res[j++] = '\n';
a++;
}
}
else
{
res[j++] = ch;
}
}
return new string(res, 0, j);
}
Bảng dịch thực sự hấp dẫn tôi ngay cả khi '\ n \ r' không thực sự được sử dụng trên nền tảng cơ bản. Ai sẽ sử dụng hai loại ngắt dòng liên tiếp để chỉ ra 2 dấu ngắt dòng? Nếu bạn muốn biết điều đó, bạn cần phải xem trước khi biết \ n và \ r đều được sử dụng riêng trong cùng một tài liệu hay không.
Nguồn
2017-11-17 11:13:55
Chờ, vì vậy bạn muốn \ n \ r ánh xạ tới \ r \ n? Đó không phải là bình thường hóa. Không có nền tảng phổ biến nào sử dụng \ n \ r như một dòng kết thúc. –
Không nói nó là một nền tảng bình thường, phải không? Tôi đã nhìn thấy dữ liệu (từ mã VB cụ thể) mã có nó theo cách đó, và tôi cần phải tài khoản cho nó. Xin lỗi nếu điều đó không đáp ứng định nghĩa "chuẩn hóa" nghiêm ngặt nhưng chắc chắn đáp ứng định nghĩa của dữ liệu tôi cần xử lý, đó là điểm – ctacke