将字符串输入视为垃圾
本文关键字:字符串 输入 | 更新日期: 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");