【问题标题】:How to split a string, where one character is a separator, and the other one is content如何拆分字符串,其中一个字符是分隔符,另一个是内容
【发布时间】:2021-09-21 10:42:15
【问题描述】:

我有一个字符串,其中包含两个特殊字符:"a""x"(如"aaxaxbcdxbcdexaxdefxdefa"),我想按照这些规则进行拆分:

  • 如果遇到"a",结果字符串将包含它作为单个字符。
  • 如果遇到"x",这将用作分隔符。

所以,我想要这个:

Stretched out input:
   a    a x  a x  bcd x  bcde x  a x  def x  def    a

{ "a", "a", "a", "bcd", "bcde", "a", "def", "def", "a" }

显然,我可以使用它进行拆分,基于"x"

string infoList[] = input_string.Split(new char[] {"x"}, StringSplitOptions.RemoveEmptyEntries);

但是"a" 的故事让我想到了扩大已经存在的数组(我担心这可能会导致性能问题)。最重要的是,我相信应该有一些单行代码(而不是写我自己的for-loop)。

编辑
简单来说:有没有string.Split(...)不去掉最终字符串中的分隔符?

有人有想法吗?

【问题讨论】:

  • 您不应该使用这样的字符串,尤其是在您传输用户输入时!使用序列化或至少进行适当的转义
  • @PatrickBeynio 我想你评论错了问题
  • @Cid 你是对的,对不起,问题看起来很相似

标签: c# arrays string


【解决方案1】:

保持简单:将每个 "a" 替换为 "xax" 并以与您相同的方式拆分:

var input_string = "aaxaxbcdxbcdexaxdefxdefa";
input_string = input_string.Replace("a", "xax");
var infoList = input_string.Split(new char[] {'x'}, StringSplitOptions.RemoveEmptyEntries);
    
Console.WriteLine(string.Join(", ", infoList));

这个输出

a, a, a, bcd, bcde, a, def, def, a

【讨论】:

    【解决方案2】:

    正则表达式是另一种可能性:如果我们输出a|[^ax]+ 模式,我们将有一个单独的a 匹配或一个没有xa 的序列

    代码:

      using System.Linq;
      using System.Text.RegularExpressions;
    
      ... 
    
      string input_string = "aaxaxbcdxbcdexaxdefxdefa";
    
      string[] infoList = Regex
        .Matches(input_string, "a|[^ax]+")
        .Cast<Match>()
        .Select(m => m.Value)
        .ToArray();
    
      Console.Write(string.Join(", ", infoList));
    

    结果:

      a, a, a, bcd, bcde, a, def, def, a
    

    【讨论】:

      【解决方案3】:

      建议的解决方案简短而好(我会在 99% 的情况下使用它们),但如果您关心性能,最好的解决方案将是普通的老式 for 循环。

      public List<string> Split(string s)
          {
              var results = new List<string>();
      
              var i = 0;
              var substringStart = 0;
      
              while (i < s.Length)
              {
                  switch (s[i])
                  {
                      case 'a':
                      case 'x':
                          if(substringStart != i)
                              results.Add(s.Substring(substringStart, i - substringStart));
      
                          if(s[i] == 'a')
                              results.Add("a");
      
                          substringStart = i + 1;
                          break;
                  }
      
                  ++i;
              }
      
              if(substringStart != i)
                  results.Add(s.Substring(substringStart, i - substringStart));
      
              return results;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-23
        相关资源
        最近更新 更多