拆分字符串并将其放回原处

Splitting a string and putting it back together

我有一个字符串,其格式类似于 "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 但没有达到我想要的效果。

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

如果你的字符串总是构建第一个和最后一个字符串部分("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"

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

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

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

应该这样做:

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 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 来 select 不同的块:

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