C# 从字符串中提取值->;团体成绩
我想提取字符串中的一些十进制数字->对字符串进行分组并对值求和 我从私有API获取字符串。它们看起来像这样:C# 从字符串中提取值->;团体成绩,c#,asp.net,regex,C#,Asp.net,Regex,我想提取字符串中的一些十进制数字->对字符串进行分组并对值求和 我从私有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",
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)
{
//...?
}
}
我想这必须用正则表达式来解决。我不知道如何创建模式,但我的最佳选择是类似于
\+\d+.?\d*
的东西。它可能在正确的轨道上,但我需要你的帮助完成它。例如,它不考虑可能的“%”(“+2.0%”)。这样做似乎有点奇怪,但这应该非常接近(在最后一行生成+4%,而不是4.0%):
var r=new System.Text.RegularExpressions.Regex(@“(?[+-]+[\d]+[\d]+)”;
foreach(foo中的变量g){
var st=g.First();
var mt=r.匹配(st);
var总和=新的双倍[mt.Count];
foreach(var l in g){
var m=r.匹配(l);
对于(变量i=0;i=0.0){sb.Append(“+”);}
else{sb.追加(“-”);}
某人追加(总和[一]);
start=mt[i]。索引+mt[i]。长度;
}
sb.追加(st.子串(开始));
Console.Write(sb.ToString());
}
是否可以有以-
开头的十进制数?当你有一行像“+0.9a/+0.62c”
”这样的代码时会发生什么?@L.B 1:No.2:像往常一样求和。这封信并不重要,谢谢你。我使用了另一个解决方案,但我会接受,因为它符合我的要求。如果你愿意,如果你发布你的解决方案,以便其他搜索答案的人以后可以有多个选项进行查看,这可能会很有趣。是的,我会添加它。注意到一只虫子。稍后发布:)
"+2.7 A / +1.86 B",
"+2,4 C",
"+4.0% D"
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());
}