0

我有一个 WPF 应用程序,它正在捕获一些文本,如下所示:

<TextBox x:Name="MyText" Text="\n,\r"/>

然后我将它传递给一个函数,该函数正在检查字符串中是否存在这些字符:

MyFunc(MyText.Text);

但是角色正在被转义;所以 MyText.Text 看起来像这样:

"\\n,\\r"

如何防止字符串被转义(如果它是文字,我可以简单地使用该@字符,但这是由用户输入的)?

4

5 回答 5

1

换成\\? \:

string unescapedValue = MyText.Text.Replace(@"\\", @"\");

但是,我怀疑您的文本值只是在 Visual Studio Intellisense 中转义......当您调用它时,您会得到什么值:

int actualLength = MyText.Text.Length;

我怀疑您的"\\n,\\r"价值会返回3,因为那里实际上只有 3 个字符。如果我错了,请使用第一个示例。

于 2013-10-25T14:33:22.050 回答
1

您将需要通过检测本身已转义的转义码来手动取消转义文本。你可以这样做:

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();
}
于 2013-10-25T15:26:55.250 回答
1

你确定吗?
我怀疑您正在查看调试,并且调试鼠标悬停会逃脱。

尝试

System.Diagnostics.Debug.WriteLine(MyText.Text);
System.Diagnostics.Debug.WriteLine(MyText.Text.Length.ToString());

长度为 5,因为 \n 是两个字符而不是单个控制字符。

于 2013-10-25T14:34:40.500 回答
1

我遇到了您遇到的同样问题,我在阅读这篇文章后设法解决了我如何在 .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
于 2015-12-02T04:54:44.020 回答
0

您应该将文本框绑定到某个属性。您不能直接通过设计器设置格式化文本。

于 2013-10-25T14:44:23.927 回答