我有一个字符串格式为“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但是没有按照我想要的那样工作。
似乎所有其他示例都将整个数组连接成一个字符串,我该怎么做?
答案 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();