0

当我通过 C# 接收输入时,它会转义\. 当我尝试解析字符串时,它会导致错误,因为它使用\\r而不是\r在字符串中。有什么方法可以防止它从字符串中逃逸\\\变成\字符串。我试过了:

protected string UnEscape(string s)
{
    if (s == "")
        return " ";
    return s.Replace(@"\\", @"\");
}

没有运气。所以还有其他建议。

编辑:

我不够具体,因为你们中的一些人似乎对我想要实现的目标感到困惑。在调试中,我正在读取"\\t"一个字符串,但我想要的"\t"不是因为我想输出\t,而是因为我想输出一个 [tab]。使用上面的代码,我有点试图重新创建已经通过 Regex.Unescape(string) 完成的东西。

4

3 回答 3

3

问题是大多数 .NET 组件不处理字符串中的反斜杠转义序列:当字符串以文字形式呈现时,编译器会为它们处理。但是,还有另一个处理转义序列的 .NET 组件 - 正则表达式引擎。你可以用来Regex.Unescape为你做取消转义:

string escaped = @"Hello\thello\nWorld!";
string res = Regex.Unescape(escaped);
Console.WriteLine(res);

打印

Hello   hello
World!

请注意,该示例使用逐字字符串,因此\t不会\n被编译器替换。该字符串以单斜杠呈现给正则表达式引擎(尽管如果您在调试器中查看该字符串,您会看到双斜杠)。escaped

于 2013-10-25T16:22:05.180 回答
1

问题不在于它转义了反斜杠,而在于它没有将转义序列解析为字符。不是在输入\r字符时获取字符\\r而是将它们作为两个单独的字符获取。

您不能在字符串中变成@"\\"into @"\",因为没有任何双反斜杠,这只是您使用调试工具查看字符串时字符串的显示方式。它实际上是一个反斜杠,你不能把它变成\转义序列的一部分,因为它本身不是一个字符。

您需要将输入中要转换的任何转义序列替换为相应的字符:

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 "\\";
  }
});
于 2013-10-25T16:15:53.217 回答
-1

如果您在输入中有三个字符\, \,r并且您想将其更改为\r字符,请尝试

input.replace(@"\\r", "\r");

如果您有两个字符\r在输入中并且您想将其更改为\r字符然后尝试

input.replace(@"\r", "\r");
于 2013-10-25T16:21:25.793 回答