代码之家  ›  专栏  ›  技术社区  ›  balexandre

如何安全地拆分字符串?

  •  4
  • balexandre  · 技术社区  · 14 年前

    | 字符,因为很难找到某人或应用程序在字符串上使用它。。。但是如果它使用了呢?

    好吧,一个简单的 将被抛出:)

    我发现一所大学 non-printable 使用相同技术的字符,例如:

    String.Format(
             "{1}{0}{2}{0}{3}{0}{4}",
             (char)2,
             myFirstString,
             mySecondString,
             myThirdString,
             myFourthString);
    

    当我们想把孔串抽出来的时候

    String.Split((char)2);
    

    这安全吗 ? 我应该接受这个吗 安全地拆线的方法? 还有别的吗

    6 回复  |  直到 14 年前
        1
  •  8
  •   Timwi    14 年前

    它可能比管道更安全,因为它比较少见,但这两种方法都是次优的,因为它们限制您使用可能的字符串子集。

    考虑使用适当的编码 对列表进行编码 任意的 串。就编码而言,最简单的方法可能是将 string[] . 你可以用 BinaryFormatter XmlSerializer 或者别的什么。

    如果结果是 要成为一根弦,它必须是 短的

    • 编码:
      • 替换为 ! !e 以及 | 具有 !p 每一根弦。现在,没有一个字符串包含 你可以很容易地扭转这种局面。
      • 使用连接字符串 | 作为分隔符。
    • (单个字符串返回到字符串列表)
      • | 性格。
      • 全部替换 !第页 具有 | !e类 具有 每一根弦。这将恢复原始字符串。
        2
  •  3
  •   Ani    14 年前

    这本质上是应用程序之间的一个契约 生产 这种格式的字符串,以及那些 消费 他们-使用任何适合你的情况。

    在内部 string[] 例如)从头开始。在这种情况下,不需要“解析”。

    另一方面,如果数据必须 在以后的消费中,有几个选择。例如:

    1. 数据库 :将每个字符串作为行存储在数据库表中。不需要拆分。
    2. 指定分隔符
    3. 转义序列 :例如。 * 是分隔符, ** 表示星号 一根绳子。这将意味着没有字符被保留用作哨兵(使其不可呈现)。另一方面,解析成为一项非常重要的任务。
    4. 专用格式
        3
  •  2
  •   John Kugelman Michael Hodel    14 年前

    如果你能帮忙的话,最好不要把字符串串在一起。像这样劈开是一种代码气味。

    当然,使用控制字符“更有可能”没有问题,但它仍然不是完美的。如果你真的要这么做,用NUL( \0 ). 那个角色至少有过当字符串哨兵的经历。

        4
  •  2
  •   hoang    14 年前

    如果希望安全,解决方案是序列化/反序列化 List<string> .

        5
  •  1
  •   Pieter van Ginkel    14 年前

    a,b,"c,d"
    

    生产:

    new[] { "a", "b", "c,d" }
    

    这可能会有帮助 http://www.codeproject.com/KB/database/CsvReader.aspx

        6
  •  0
  •   Bronumski    14 年前

    这取决于字符串的预期内容。如果预期的字符串可能有不可打印的字符,那么可能没有。另一种方法是对要拆分的字符串进行转义,它看起来像更多的工作,但可以放入可重用的助手中:

    var string1 = "string|1";
    var string2 = "string |2";
    var string3 = "string| 3";
    var string4 = "string | 4";
    
    var stringToSplit = MergeStrings(string1, string2, string3, string4);
    
    var results = SplitString( stringToSplit );
    
    foreach(string result in results)
    {
        Trace.WriteLine( result );
    }
    

    public string MergeStrings(params string[] strings)
    {
        var stringBuilder = new StringBuilder();
    
        foreach(var s in strings)
        {
            stringBuilder.Append( s.Replace( "|", "||" ) );
            stringBuilder.Append( " | " );
        }
    
        return stringBuilder.ToString();
    }
    
    public IEnumerable<string> SplitString(string stringToSplit)
    {
        var results = stringToSplit.Split( new[] { " | " }, StringSplitOptions.RemoveEmptyEntries );
    
        return results.Select( result => result.Replace( "||", "|" ) );
    }
    

    您可能希望使分隔符可自定义。