我有一个 WPF 应用程序,它正在捕获一些文本,如下所示:
<TextBox x:Name="MyText" Text="\n,\r"/>
然后我将它传递给一个函数,该函数正在检查字符串中是否存在这些字符:
MyFunc(MyText.Text);
但是角色正在被转义;所以 MyText.Text 看起来像这样:
"\\n,\\r"
如何防止字符串被转义(如果它是文字,我可以简单地使用该@
字符,但这是由用户输入的)?
我有一个 WPF 应用程序,它正在捕获一些文本,如下所示:
<TextBox x:Name="MyText" Text="\n,\r"/>
然后我将它传递给一个函数,该函数正在检查字符串中是否存在这些字符:
MyFunc(MyText.Text);
但是角色正在被转义;所以 MyText.Text 看起来像这样:
"\\n,\\r"
如何防止字符串被转义(如果它是文字,我可以简单地使用该@
字符,但这是由用户输入的)?
换成\\
? \
:
string unescapedValue = MyText.Text.Replace(@"\\", @"\");
但是,我怀疑您的文本值只是在 Visual Studio Intellisense 中转义......当您调用它时,您会得到什么值:
int actualLength = MyText.Text.Length;
我怀疑您的"\\n,\\r"
价值会返回3
,因为那里实际上只有 3 个字符。如果我错了,请使用第一个示例。
您将需要通过检测本身已转义的转义码来手动取消转义文本。你可以这样做:
private static string Unescape(string value) {
if (value == null)
return null;
var length = value.Length;
var result = new StringBuilder(length);
for (var i = 0; i < length; i++) {
var c = value[i];
if (c == '\\' && i++ < length) {
c = value[i];
switch (c) {
case 'n':
result.Append('\n');
break;
case 'r':
result.Append('\r');
break;
case 't':
result.Append('\t');
break;
case '\\':
result.Append('\\');
break;
default:
result.Append(c);
break;
}
}
else {
result.Append(c);
}
}
return result.ToString();
}
你确定吗?
我怀疑您正在查看调试,并且调试鼠标悬停会逃脱。
尝试
System.Diagnostics.Debug.WriteLine(MyText.Text);
System.Diagnostics.Debug.WriteLine(MyText.Text.Length.ToString());
长度为 5,因为 \n 是两个字符而不是单个控制字符。
我遇到了您遇到的同样问题,我在阅读这篇文章后设法解决了我如何在 .net 中取消转义和转义字符串?
System.Text.RegularExpressions.Regex.Unescape(MyText.Text);
它会自动转义你的字符串
\\n => \n
\\t => \t
我可以看到很多人不明白这是如何导致问题的
一个简单的例子如下所示:
var delimiter = MyText.Text; // this will give you \\t, if you type \t in the textbox
string[] data = new string[] { "hello", "world" };
var concatData = String.Join(text, data);
// concatData will return => hello\\tworld\\t rather than hello world
您应该将文本框绑定到某个属性。您不能直接通过设计器设置格式化文本。