0

我想在字符串中提取一些十进制数字 - >对字符串进行分组并对值求和。

我从私有 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%”)。

4

1 回答 1

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());
            }
于 2013-10-20T21:52:38.090 回答