【问题标题】:Treat string input as litteral将字符串输入视为文字
【发布时间】:2013-10-26 04:19:55
【问题描述】:

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

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

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

编辑:

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

【问题讨论】:

  • 错误说明了什么
  • 这可能是您接受输入的问题。您如何接受输入?
  • 你是怎么看字符串值的?
  • 使用文本框并且没有错误它不会用 \ 替换 \\ 它只是扔回 \\t。
  • Replace method c# not working as expected 的可能重复项 - 完全相同,除非另有证明 - 在调试器中查看字符串将显示特殊字符已转义。

标签: c# .net string


【解决方案1】:

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

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

这个prints

Hello   hello
World!

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

【讨论】:

  • 使用逐字字符串文字。
  • 绝对是我想要的。谢谢。
  • @SLaks 谢谢,这是个好主意——它让代码对读者来说看起来更干净。谢谢!
【解决方案2】:

问题不在于它转义了反斜杠,而在于它没有将转义序列解析为字符。在输入字符 \\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",而不是 "\\\r"
  • @Servy:你在说什么?代码中没有这样的字符串。
  • 对,我不应该在那里使用字符串文字。重点是 r 之前的转义 \ 字符不应导致转换为回车,因为转义字符已转义。这……使问题复杂化了。
  • @Servy:你为什么这么认为? OP 专门要求用单个字符 \r 替换两个字符 \\r,这就是代码的作用。
  • OP 正在寻求对字符串文字进行转义。他举了一个使用一个转义序列的例子;这并不意味着他不希望处理任何其他转义序列。
【解决方案3】:

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

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

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

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

【讨论】:

  • 这不处理转义的转义字符。 "\\\\r" 应该是 "\\r",而不是 "\\\r"
  • @Servy 你似乎对"\\\\r"有一点兴趣
  • 这是一个特别难的问题;似乎有几个人没有意识到这一点。请注意,这只是证明该方法存在潜在缺陷的一个示例。你给出了和另外两个人一样的答案,你的方法有同样的缺陷。我认为没有必要为相同的方法重新编写另一个反例。
  • @Servy,我不同意。这是一个相当简单的问题。挑战仅在于找出 OP 实际要求的内容。
  • 如果您使用 das 的答案,这很简单,因为正则表达式引擎会为您解决它。通过纯字符串操作来编写它并不容易。或者,至少,您的答案不正确。如果您可以提供一个简单的解决方案来正确处理转义转义字符,那么我很乐意看到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2023-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多