我有以下字符串。
string str = @"One
Two
Four
Five
Six
Seven
Eight
Thirteen
Twenty
";
我想删除此字符串中的额外新行。这样字符串看起来应该是这样的:
str = "One
Two
Four
Five
Six
Seven
Eight
Thirteen
Twenty"
我正在使用此代码,但它无效。
Str = Str.Replace("\n\n", "\n");
while (Str.IndexOf("\n") > 0)
{
Str = Str.Replace("\n\n", "\n");
}
我甚至试过Str = Str.Replace("\u000a\u000a", "\u000a");
但是它仍然没有成功。
答案 0 :(得分:7)
您可以将字符串拆分为行,删除空条目并将其重新连接在一起:
var lines = str.Split('\n')
.Where(s => !string.IsNullOrWhiteSpace(s));
str = string.Join("\n", lines);
答案 1 :(得分:3)
试试这个:
str = System.Text.RegularExpressions.Regex.Replace(str, "(" + Environment.NewLine + ")+", Environment.NewLine)
请参阅here以了解有关Environment.Newline
的更多信息。但即使是上面的代码也不能保证删除重复的换行符,因为您正在解析的文档或字符串可以在不同的机器上创建,其中换行符的代码是不同的:
"\r\n"
- windows newline,"\n"
- unix换行符,"\r
" - mac newline 对于正则表达的介绍,wikipedia文章应该是非常有用的,但通常是:
Environment.Newline
可以是多个字符,例如"\r\n"
,这就是为什么我将此变量括在"()"
中以将其标记为一组字符(单个元素)应该是被视为原子,"+"
与前一个元素(Environment.Newline
中包含的"()"
)匹配一次或多次。由于上面和Regex.Replace
,我们得到了所需的输出。
答案 2 :(得分:0)
我尝试了你的代码,它暂时挂起。这是预期的,因为替换永远不会消除所有\n
实例。您想要将当前的while循环更改为:
while (str.IndexOf("\n\n") > 0)
{
str = str.Replace("\n\n", "\n");
}
这将循环,直到删除\n\n
的任何重复实例。
编辑:我已经针对各种情况对此进行了测试,只要字符串不以\n
或\n\n
开头,它就可以正常运行。