Dan*_*ner 62
input.Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", "\r\n")
Run Code Online (Sandbox Code Playgroud)
如果输入只包含一种类型的换行符(CR,LF或CR + LF),这将起作用.
Jon*_*eet 29
这取决于准确的要求是什么.特别是,你想如何自己处理"\ r"?这应算作换行吗?作为一个例子,如何处理"a \n\rb"?这是一个非常奇怪的换行,一个"\n"休息然后是一个流氓"\ r",还是两个单独的换行符?如果"\ r"和"\n"都可以自行换行,为什么"\ r \n"不能被视为两个换行符?
这是一些我怀疑合理有效的代码.
using System;
using System.Text;
class LineBreaks
{
static void Main()
{
Test("a\nb");
Test("a\nb\r\nc");
Test("a\r\nb\r\nc");
Test("a\rb\nc");
Test("a\r");
Test("a\n");
Test("a\r\n");
}
static void Test(string input)
{
string normalized = NormalizeLineBreaks(input);
string debug = normalized.Replace("\r", "\\r")
.Replace("\n", "\\n");
Console.WriteLine(debug);
}
static string NormalizeLineBreaks(string input)
{
// Allow 10% as a rough guess of how much the string may grow.
// If we're wrong we'll either waste space or have extra copies -
// it will still work
StringBuilder builder = new StringBuilder((int) (input.Length * 1.1));
bool lastWasCR = false;
foreach (char c in input)
{
if (lastWasCR)
{
lastWasCR = false;
if (c == '\n')
{
continue; // Already written \r\n
}
}
switch (c)
{
case '\r':
builder.Append("\r\n");
lastWasCR = true;
break;
case '\n':
builder.Append("\r\n");
break;
default:
builder.Append(c);
break;
}
}
return builder.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
简单变体:
Regex.Replace(input, @"\r\n|\r|\n", "\r\n")
Run Code Online (Sandbox Code Playgroud)
为了更好的表现:
static Regex newline_pattern = new Regex(@"\r\n|\r|\n", RegexOptions.Compiled);
[...]
newline_pattern.Replace(input, "\r\n");
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
109023 次 |
最近记录: |