当我通过C#收到输入时,它会转出\
。当我尝试解析字符串时,它会导致错误,因为它在字符串中使用\\r
而不是\r
。是否有某种方法可以阻止它在字符串中转义\
或者将\\
转换为\
。我试过了:
protected string UnEscape(string s)
{
if (s == "")
return " ";
return s.Replace(@"\\", @"\");
}
没有运气。所以任何其他建议。
编辑:
我不够具体,因为有些人似乎对我想要达到的目标感到困惑。在调试中,我在字符串中阅读"\\t"
,但我不想"\t"
,因为我想输出\t
但是因为我想输出[tab]。使用上面的代码,我试图重新创建已经通过Regex.Unescape(字符串)完成的东西。
答案 0 :(得分:3)
问题是大多数.NET组件不处理字符串中的反斜杠转义序列:编译器在字符串表示为文字时为它们执行。但是,还有另一个处理转义序列的.NET组件 - 正则表达式引擎。您可以使用Regex.Unescape
为您进行转义:
string escaped = @"Hello\thello\nWorld!";
string res = Regex.Unescape(escaped);
Console.WriteLine(res);
Hello hello
World!
请注意,该示例使用逐字字符串,因此\t
和\n
不被编译器替换。字符串escaped
以单斜杠呈现给正则表达式引擎(尽管如果你在调试器中查看字符串,你会看到双斜杠)。
答案 1 :(得分:1)
问题不在于它正在逃避反斜杠,而是它没有将转义序列解析为字符。输入字符\r
和\\
时,不会获得r
字符,而是将它们作为两个单独的字符。
您无法将@"\\"
转换为字符串中的@"\"
,因为没有任何双反斜杠,这只是使用调试工具查看字符串时的显示方式。它实际上是一个反斜杠,你不能把它变成转义序列的\
部分,因为它本身不是一个字符。
您需要使用相应的字符替换要转换的输入中的任何转义序列:
s = s.Replace("\\r", "\r");
要处理Servy所讨论的特殊情况,请立即替换所有转义序列。例如:
s = Regex.Replace(s, @"\\([\\rntb])", m => {
switch (m.Groups[1].Value) {
case "r": return "\r";
case "n": return "\n";
case "t": return "\t";
case "b": return "\b";
default: return "\\";
}
});
答案 2 :(得分:-1)
如果您在输入中有三个字符\
,\
,r
,并且您想将其更改为\r
字符,请尝试
input.replace(@"\\r", "\r");
如果输入中有两个字符\
,r
,并且您想将其更改为\r
字符,请尝试
input.replace(@"\r", "\r");