将字符串输入视为垃圾

本文关键字:字符串 输入 | 更新日期: 2023-09-27 18:36:56

当我通过 C# 接收输入时,它会转义'。当我尝试解析字符串时,它会导致错误,因为它使用 ''r 而不是字符串中的'r。有没有办法防止它逃脱'或可能将''变成字符串中的'。我试过:

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

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

编辑:

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

将字符串输入视为垃圾

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

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

这打印

Hello   hello
World!

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

问题不在于它转义反斜杠,而在于它没有将转义序列解析为字符。输入字符''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 "''";
  }
});

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

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

如果输入中有'r 的两个字符,并且您想将其更改为'r字符,请尝试

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