将字符串输入视为文字

时间:2013-10-25 16:08:39

标签: c# .net string

当我通过C#收到输入时,它会转出\。当我尝试解析字符串时,它会导致错误,因为它在字符串中使用\\r而不是\r。是否有某种方法可以阻止它在字符串中转义\或者将\\转换为\。我试过了:

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

没有运气。所以任何其他建议。

编辑:

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

3 个答案:

答案 0 :(得分:3)

问题是大多数.NET组件不处理字符串中的反斜杠转义序列:编译器在字符串表示为文字时为它们执行。但是,还有另一个处理转义序列的.NET组件 - 正则表达式引擎。您可以使用Regex.Unescape为您进行转义:

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

prints

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");