我如何在.net中进行Unescape和Reescape字符串?

Fir*_*oso 22 .net c# string escaping

我需要一个WPF控件上的TextBox,它可以接收文本Commit\r\n\r(这是.net字符串"Commit\\r\\n\\r")并将其转换回"Commit\r\n\r".net字符串.我希望有一个string.Unescape()和string.Escape()方法对,但它似乎不存在.我是否必须自己写?或者有更简单的方法吗?

小智 42

System.Text.RegularExpressions.Regex.Unescape(@"\r\n\t\t\t\t\t\t\t\t\tHello world!")
Run Code Online (Sandbox Code Playgroud)

Regex.Unescape方法文档

  • 请注意这是特定于"正则表达式"的,并且还将字符串转换为`@"\ ["`转换为`@"["`这只是在我们讨论正则表达式而不是普通字符串时才需要的. (11认同)
  • System.Text.RegularExpressions.Regex.Unescape() (7认同)

Fyo*_*kin 9

汉斯的代码,改进版.

  1. 使用StringBuilder - 长字符串上真正的性能助推器
  2. 使它成为一种扩展方法

    public static class StringUnescape
    {
        public static string Unescape(this string txt)
        {
            if (string.IsNullOrEmpty(txt)) { return txt; }
            StringBuilder retval = new StringBuilder(txt.Length);
            for (int ix = 0; ix < txt.Length; )
            {
                int jx = txt.IndexOf('\\', ix);
                if (jx < 0 || jx == txt.Length - 1) jx = txt.Length;
                retval.Append(txt, ix, jx - ix);
                if (jx >= txt.Length) break;
                switch (txt[jx + 1])
                {
                    case 'n': retval.Append('\n'); break;  // Line feed
                    case 'r': retval.Append('\r'); break;  // Carriage return
                    case 't': retval.Append('\t'); break;  // Tab
                    case '\\': retval.Append('\\'); break; // Don't escape
                    default:                                 // Unrecognized, copy as-is
                        retval.Append('\\').Append(txt[jx + 1]); break;
                }
                ix = jx + 2;
            }
            return retval.ToString();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)