为什么从我的verbatim字符串中删除换行符只返回最后一行?

3

I have the following code:

string test = @"1
2
3";

这行代码:
Console.WriteLine(test.Replace("\n", "")); //3

输出的是"3"而不是我期望的"123"。为什么这个方法只返回字符串的最后一行,如何去除所有换行符?


如果您执行类似于test = test.Replace.Trim()这样的操作会发生什么? - MethodMan
3
同样的事情。 - Servy
4个回答

8

Console.WriteLine(test.Replace("\n", ""));返回给我所有的数字。在处理换行符时,您必须注意换行符可能是\r\n,这取决于平台。在这种情况下,您应该使用以下内容:

test.Replace("\r\n", "")
// or better:
test.Replace(Environment.NewLine, "")

参考"\n"和Environment.NewLine之间的区别


1
逐字字符串不使用"\r\n",它使用源文件的编码,理论上可以是任何东西。 - Jeff Walker Code Ranger
@JeffWalkerCodeRanger,你错了。默认情况下,所有字符串都使用 UTF-16,请参考此文档页面。C#支持两种形式的字符串字面量:常规和逐字。这两种形式都使用相同的编码方式。 - Zbigniew
@walkhard 是的,所有的 C# 字符串都使用 UTF-16 编码。我指的是行结束编码(即它们是 Unix 还是 PC 行结束)。这确实“遵循源文件的编码”。因此,建议的代码并不是从字符串中安全删除所有行结束的方法。 - Jeff Walker Code Ranger

2

如果你在编写文本文件的系统和编译或运行它的系统之间换行符可能不同的情况下,你可能需要进行以下操作:

string test = @"1
2
3";
Console.WriteLine(test.Replace(@"
", "");

尽力确保字符串文字中的换行符与您要替换的换行符相同。


假设这两行代码在同一个源文件中,那么这是正确的,因为源代码中的行结尾可以是任何东西。 - Jeff Walker Code Ranger

1

原样字符串使用其所在源代码文件的行尾。鉴于像git这样的源控制环境可能会将行尾转换为本地行尾,因此该字符串也会受到影响。

string test = @"1
2
3";

可能会有任何一组行尾("\r\n""\r""\n")。唯一安全的删除任何可能的行尾的方法是:

Console.WriteLine(test.Replace("\n", "").Replace("\r", ""));

这并不假定这两个代码片段在同一个源文件中(因为两个源文件的行结尾可以不一样)。

有关“逐字字符串使用其所在源代码文件的行结尾”的参考资料吗?这将非常有用,因为我正在看到这种行为-即在VS中开发机上测试通过,在从git获取时在TeamCity机器上失败。 - Nick Baker
1
@NickBaker 我想编程语言规范应该会这么说,但我认为它并不清楚。我个人进行了测试并验证了这一点。 - Jeff Walker Code Ranger

0

verbatim字符串使用"\r\n"作为换行符,因此您替换的结果是"1\r2\r3"

如果您改用test.Replace("\r\n", ""),它将按预期工作。要处理任意数量的\r\n的情况,请使用:test.Replace("\r", "").Replace("\n", "")。这将适用于\r\n\r\n作为分隔符的情况。


逐字字符串不使用"\r\n",它使用源文件的编码,理论上可以是任何东西。 - Jeff Walker Code Ranger
@JeffWalkerCodeRanger 是的,理论上它可以是任何东西,但我确信在这种特定情况下它实际上是"\r\n",因为已经尝试过"\n"并失败了,而这两个是最常用的。此外,我提供的解决方案适用于任何组合的"\n"和"\r"。我不知道有任何系统使用除这两个字符之外的字符作为换行符分隔符。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接