我正在尝试拆分以下字符串
string v = "A: 1,5 ,B:2,44,C: 3,54,D: 5,11";
string[] val = v.Split(',');
for (int i = 0; i < val.Length; i++)
{
val[i] = val[i].ToString().Trim();
}
问题是内部有逗号数字,因此拆分不正确。有没有办法在我的数组中得到正确的值“A:1,5”,“B:2,44”,“C:3,54”,“D:5,11”?我正在使用C#2.0
答案 0 :(得分:2)
如果您的格式必须是一个字母,后面跟一个冒号,那么是一个浮点数,用逗号分隔这些条目:
string patternDelim = @"([A-Z]):"; // split on 'X:'
// @"([A-Z]+):" // split on 'ABC:'
// @"([A-Z][A-Z0-9]*):" // split on 'A1B2C3:'
string[] values = Regex.Split(input, patternDelim);
因为我们已经使用捕获组作为分隔符,它将最终出现在我们的输出中。所以,在这一点上,我们已经把输入分成了这样的东西:
A
1,5 ,
B
2,44,
C
3,54,
D
5,11
现在我们只需要将它们提取到实际的数据对中:
Dictionary<string, string> pairs = new Dictionary<string, string>();
for (int ii = 0; ii < values.Length; ++ii)
{
// empty values are skipped
if (values[ii].Length == 0) continue;
string value = values[ii + 1].Trim()
.TrimEnd(','); // remove any trailing commas
pairs.Add(values[ii], value.TrimEnd());
ii++; // use two each time
}
这将产生一个键值对字典,如下所示:
A = 1,5
B = 2,44
C = 3,54
D = 5,11
您可以使用相应的CultureInfo
或NumberFormatInfo
按照自己的意愿进行解析。注意,这也适用于所有小数分隔符,即使存在数千个分隔符:
Input = A: 1.000,5 ,B:2,44,C: 3,54e+38,D: -,11
A = 1.000,5
B = 2,44
C = 3,54e+38
D = -,11
答案 1 :(得分:1)
string v = "A: 1,5 ,B:2,44,C: 3,54,D: 5,11";
string[] val = Regex.Matches(v, @"\w+\s*\:\s*\d+\s*\,\s*\d+")
.Cast<Match>()
.Select(m => m.Value)
.ToArray();
答案 2 :(得分:0)
如果无法更改源字符串,我会拆分字母:
v.Split(new[] {'A', 'B', 'C', 'D'});
或
v.Split(new[] {"A:", "B:", "C:", "D:"});
而不是整理产生的部分。
答案 3 :(得分:0)
另一个丑陋的选择,虽然有效
static void Main(string[] args)
{
string v = "A: 1,5 ,B:2,44,C: 3,54,D: 5,11";
IEnumerable<string> result = Foo(v).ToArray();
// A: 1,5
// B:2,44
// C: 3,54
// D: 5,11
}
public static IEnumerable<string> Foo(string s)
{
var sb = new StringBuilder();
bool shouldFlush = false;
bool firstIteration = true;
foreach (char c in s)
{
if (!firstIteration)
{
shouldFlush = char.IsLetter(c);
}
if (shouldFlush)
{
string result = sb.ToString().Trim(' ', ',');
sb.Clear();
yield return result;
}
sb.Append(c);
firstIteration = false;
}
yield return sb.ToString().Trim(' ', ',');
}
答案 4 :(得分:0)
string v = "A: 1,5 ,B:2,44,C: 3,54,D: 5,11";
string outstr = Regex.Replace(v, "([A-Z-a-z]+)(: *)([0-9]+,*[0-9]*)([ ,]*)", "$1:$3_");
string[] newStringArray = outstr.Split('_');
答案 5 :(得分:-1)
快速回答(未经测试):
string[] parts = v.Split(',');
List<string> grouped = new List<string>();
for(int i = 0; i < parts.Length; i++)
grouped.Add(parts[i].Trim() + "," + parts[++i].Trim());