当'\'后跟一个成为有效转义序列的字符时,在'\'字符上拆分一个字符串

时间:2011-03-01 10:59:36

标签: c#

        public void Test(String userWithDomain)
        {   
            // assume userWithDomain could be a console input or an ajax call.

            // 1: userWithDomain = "domain\\user"; 
            // 2: userWithDomain = "domain\user"; 
            // 3: userWithDomain = "domain\test";

            // (1) would work;
            // (2) would work too [this kind of input is not valid from within a C# app]
            // (3) wouldn't work because \t would a valid escape sequence and output would be "domin" "est"

            String[] split = userWithDomain.Split(new String[] { "\\" }, StringSplitOptions.RemoveEmptyEntries);

            foreach (String item in split)
            {
                Console.WriteLine(item);
            }

            // How do I fix (3)?
        }

修改

代码适用于所有情况,但如果从JavaScript(“domain \ testuser”)等javascript调用此方法则会失败;

2 个答案:

答案 0 :(得分:5)

我的猜测是,你的测试数据被搞砸了,而不是代码。

例如,如果你正在做:

string userWithDomain = "domain\test";

那么不是你从AJAX,控制台输入等实际得到的东西 - 因为你实际上有“域”,然后是一个标签,然后是“est”。

要在C#源代码中表示文本“domain \ test”,最简单的方法是使用逐字字符串文字:

string userWithDomain = @"domain\test";

在您的测试用例中使用 ,我怀疑您会发现它工作正常。 (我个人使用userWithDomain.Split('\\', StringSplitOptions.RemoveEmptyEntries),但这确实是一个不同的问题。)

答案 1 :(得分:0)

你要做的是你实际上无法做到的事情。因为你无法“检测”javascript作者想要反斜杠后跟一个t或一个真正的标签。您需要依赖您的javascript作者在需要时使用正确的转义格式。

如果您对此非常有信心(假设转义字符不是用户名中的有效字符),您可以再次将其转义,例如查找所有标签并再次使用@"\t"替换它们。