拆分字符串并将其放回原处
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();
我有一个字符串,其格式类似于 "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();