0

文字列からいくつかの 10 進数を抽出したい -> 文字列をグループ化し、値を合計します。

プライベート 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.0% ではなく +4% を生成します)。

        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 に答える