转义字符串中的转义字符

时间:2013-10-25 14:20:31

标签: c# .net wpf xaml special-characters

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

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

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

MyFunc(MyText.Text);

但角色正在逃脱;所以MyText.Text看起来像这样:

"\\n,\\r"

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

5 个答案:

答案 0 :(得分:1)

如何用\\替换\?:

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

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

int actualLength = MyText.Text.Length;

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

答案 1 :(得分:1)

你确定吗? 我怀疑你正在看调试和调试鼠标会逃脱。

尝试

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

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

答案 2 :(得分: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();
}

答案 3 :(得分:1)

我遇到了您遇到的同样问题,我在阅读完这篇文章后设法解决了这个问题How can I Unescape and Reescape strings in .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

答案 4 :(得分:0)

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