在C#中将字符串中的\\n替换为\n

9

我有一个字符串

var string = "I have a a string \\nThis is a new line\\nThis is another";

what I want is

var string = "I have a a string \nThis is a new line\nThis is another";

我使用过

string.Replace("\\","\");
Newline in constant

但是出现了“常量中的换行符”错误信息。
2个回答

18

常量中的换行符错误是由于在C#中"\"是无效的字符串文字导致的。你可能想表示一个字面上的\符号,所以你必须要用"\\"

"\\n"是一个包含1个字面上的\符号和一个字面上的n字母的字符串。你需要得到"\n",一个换行符。这里没有\,它是一个转义序列。因此,在这里用\\替换\不能起作用。

如果你只想将所有跟随\n替换为换行符,那么你可以使用.Replace(@"\n", "\n")这里@"\n"是一个逐字字符串文字,它查找一个字面上的\+n,并用表示换行符(LF)符号的转义序列\n替换它。

此外,您可能希望使用Regex.Unescape将所有转义实体转换为它们的字面表示

var s = "I have a a string \\nThis is a new line\\nThis is another";
Console.Write(Regex.Unescape(s));

C# demo 的结果请参考此处

I have a a string 
This is a new line
This is another

不,这只是一个糟糕的答案。问题在于OP不理解字符串字面量的复杂性。解决方案是像juharr那样解释它们,而不是提供过于聪明的技巧。 - Alan Moore
@AlanMoore:你可能错过了我在答案开头的解释。一切都已经解释清楚了。此外,这将把 \\r(文字 \ + r)转换为 \r(CR 符号),juharr 将不得不使用链接的 Replace 方法。很多事情取决于输入字符串本身、它的来源以及可能包含的内容。 - Wiktor Stribiżew
你没有解释替换字符串有什么问题,这就是错误信息所指的。 - Alan Moore
这样已经好多了,但我仍然不能推荐在这种情况下使用Regex.Unescape(),特别是对于初学者。 - Alan Moore
我在我的应用程序中已经使用Regex.Unescape超过5年,它非常有效。只要正确记录并明智使用即可。 - Wiktor Stribiżew
它可以工作,但只能处理像\\t\\n这样的序列,这些序列可以转换为实际字符。例如,\\s会抛出异常。我还尝试了\\b,半期望它删除前一个字符,但它只是变成了空白。 - Alan Moore

16

你真正想要替换的是反斜杠后跟字母“n”为换行符。

string.Replace("\\n","\n");

Replace("\\","\") 报编译错误的原因是反斜杠正在转义双引号,所以字符串会一直延续到行尾,这在非文本字符串中是不允许的(除非以 @ 开头)。


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