拆分字符串并将其重新组合

时间:2016-01-11 12:02:29

标签: c# arrays string string-split

我有一个字符串格式为“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但是没有按照我想要的那样工作。

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

5 个答案:

答案 0 :(得分:2)

如果您的字符串始终构建为第一个和最后一个字符串部分(“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"

答案 1 :(得分:1)

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

 "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),
  };

答案 2 :(得分:1)

根据输入数据的变化情况,您还可以使用^(.+)\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"
    }
}

答案 3 :(得分:1)

这应该这样做:

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的长度永远不会改变。

答案 4 :(得分:0)

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

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();