我想在字符串中提取一些十进制数字 - >对字符串进行分组并对值进行求和。
我从私有API获取字符串。他们看起来像这样:
var foo = new List<string>()
{
"+0.9 A / +0.62 B",
"+0.9 A / +0.62 B",
"+0.9 A / +0.62 B",
"+1.2 C",
"+1.2 C",
"+2.0% D",
"+2.0% D"
}.GroupBy(x => x).ToList();
foreach (var group in foo)
{
foreach (var str in group)
{
//...?
}
}
期望的结果:
"+2.7 A / +1.86 B",
"+2,4 C",
"+4.0% D"
我想这必须使用正则表达式来解决。我不知道如何创建一个模式,但我最好的选择是\+\d+\.?\d*
。它可能在正确的轨道上,但我需要你的帮助来完成它。例如,它不考虑可能的“%”(“+ 2.0%”)。
答案 0 :(得分:2)
看起来有点奇怪,但这应该非常接近(在最后一行产生+ 4%而不是4.0%):
var r = new System.Text.RegularExpressions.Regex(@"(?<Num>[+-]+[\d]+.[\d]+)");
foreach (var g in foo) {
var st = g.First();
var mt = r.Matches(st);
var sums = new double[mt.Count];
foreach (var l in g) {
var m = r.Matches(l);
for (var i = 0; i < m.Count; i++) {
double d;
if (double.TryParse(m[i].Value, out d)) {
sums[i] += d;
}
}
}
var sb = new StringBuilder();
var start = 0;
for (var i = 0; i < mt.Count; i++) {
sb.Append(st.Substring(start, mt[i].Index - start));
if (sums[i] >= 0.0) { sb.Append("+"); }
else { sb.Append("-"); }
sb.Append(sums[i]);
start = mt[i].Index + mt[i].Length;
}
sb.AppendLine(st.Substring(start));
Console.Write(sb.ToString());
}