【问题标题】:Splitting a string and putting it back together拆分字符串并将其重新组合在一起
【发布时间】:2016-01-11 12:02:29
【问题描述】:

我有一个格式类似于“C 01 ABC 02 AB”的字符串

我将它与

分开
string[] line = String.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

它就像一个魅力。

但我需要以不同的格式放回它。

我需要先 C,然后是“01 ABC 02”,最后是 AB。

基本上我需要将“C 01 ABC 02 AB”更改为三个较小的字符串,分别为“C”“01 ABC 02”和“AB”。

遗憾的是,ABC 和 02 部分的长度可能会发生变化,因为我无法分配固定变量来进行拆分。

我尝试了 string.Join,但没有按我的意愿工作。

似乎所有其他示例都将整个数组连接成一个字符串,我该怎么做?

【问题讨论】:

  • 你不能做类似str1=line[0];str2=line[1]+line[2]+line[3];str3=line[4]; 的事情吗?或者你的问题有什么我不明白的地方?
  • C 和 AB 是固定长度的吗?
  • 有几种可能性,但您还没有明确定义这些“部分”的定义。你怎么知道首先要分开什么,第二个是什么等等?空格是传入字符串的定义属性吗?否则,它看起来就像随机分组......
  • 对不起,你是对的。唯一安全的拆分方式是使用空格。 C 和 AB 的长度是固定的。 ABC 和 02 可以不同。

标签: c# arrays string string-split


【解决方案1】:

如果你的字符串总是构建第一个和最后一个字符串部分(“C”和“AB”)没有空格,你可以使用这样的东西:

string[] parts = "C 01 ABC 02 AB".Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
string part1 = parts[0]; // "C"
string part2 = string.Join(" ", parts.Skip(1).Take(parts.Length - 2)); // "01 ABC 02"
string part3 = parts[parts.Length - 1]; // "AB"

如果总是固定 5 个部分,您可以简化:

string[] parts = "C 01 ABC 02 AB".Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
string part1 = parts[0]; // "C"
string part2 = string.Join(" ", parts.Skip(1).Take(3)); // "01 ABC 02"
string part3 = parts[4]; // "AB"

【讨论】:

    【解决方案2】:

    所以,如果我理解你的话,你想要

     "C 01 ABC 02 AB" ->             ["C", "01 ABC 02", "AB"]             // 3 items
     "C 01 ABC 02 bla bla bla AB" -> ["C", "01 ABC 02 bla bla bla", "AB"] // 3 items
     "C 01 02 AB"     ->             ["C", "01 02", "AB"]                 // 3 items
    

    在这种情况下

      String source = "C 01 ABC 02 AB";
    
      int first = source.IndexOf(' ');
      int last = source.LastIndexOf(' '); 
    
      String[] line = new String[] {
        source.Substring(0, first),
        source.Substring(first + 1, last - first - 1),
        source.Substring(last + 1),
      };
    

    【讨论】:

      【解决方案3】:

      应该这样做:

      string x = "C 01 ABC 02 AB";
      string s1 = x.Substring(0, 1);
      string s2 = x.Substring(2, x.Length - 5);
      string s3 = x.Substring(x.Length - 2);
      

      考虑到 C 和 AB 的长度永远不会改变。

      【讨论】:

      • 看起来不错,但遗憾的是我们公司不赞成使用 var 类型 :)
      • 知道了,所以改了
      【解决方案4】:

      根据输入数据的变化程度,您还可以使用像^(.+)\s(\d+\s.+?\s\d+)\s(.+) 这样的正则表达式。这将导致匹配三个组,分别包含“C”、“01 ABC 02”和“AB”。

      这确实意味着中间部分必须始终存在数字,后跟一个字符串,然后再跟一个数字。另一个好处是您还可以检查输入字符串是否具有某种格式。

      using System;
      using System.Text.RegularExpressions;
      
      public class Program
      {
          public static void Main()
          {
              var result = Regex.Match("C 01 ABC 02 AB", @"^(.+)\s(\d+\s.+?\s\d+)\s(.+)");
              Console.WriteLine(result.Groups[0].Value); // "C 01 ABC 02 AB"
              Console.WriteLine(result.Groups[1].Value); // "C"
              Console.WriteLine(result.Groups[2].Value); // "01 ABC 02"
              Console.WriteLine(result.Groups[3].Value); // "AB"
          }
      }
      

      【讨论】:

        【解决方案5】:

        您可以使用正则表达式来提取您的值:

        var pattern = new Regex(@"(?<first>[A-Z0-9]+)\s(?<second>(([0-9]+)\s([A-Z]+)\s[0-9]+))\s(?<third>[A-Z]+)");
        var line = pattern.Match(input);
        var first = line.Groups["first"].Value;
        var second = line.Groups["second"].Value;
        var third = line.Groups["third"].Value;
        

        或者你可以对块进行子串化:

        var first = line.Substring(0, line.IndexOf(' '));
        var second = line.Substring(line.IndexOf(' ') + 1, line.LastIndexOf(' ') + 1);
        var third = line.Substring(line.LastIndexOf(' ') + 1);
        

        或者使用 Linq 选择不同的块:

        string[] line = String.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
        var first = line.First();
        var second = string.Join(' ', line.Skip(1).Take(3).ToArray());
        var third = line.Last();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-07
          • 1970-01-01
          • 1970-01-01
          • 2013-09-12
          • 2015-08-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多