C# 获取字符串上的一组数字
我有一个由数字和字母组成的字符串,如下例所示:C# 获取字符串上的一组数字,c#,regex,linq,C#,Regex,Linq,我有一个由数字和字母组成的字符串,如下例所示: string strFood = "123d 4hello12"; 我想要完成的是得到所有的数字组,即123、4和12 我试图通过LinQ实现这一点,但我没有得到数组结果,因为我的计划是得到数组,然后将它们相加,即123+4+12,结果是139 这是我到目前为止尝试过的,但这不会导致字符串或整数组: string[] strArr = strFood .GroupBy(y => Char.IsDigit(y)).Se
string strFood = "123d 4hello12";
我想要完成的是得到所有的数字组,即123、4和12
我试图通过LinQ实现这一点,但我没有得到数组结果,因为我的计划是得到数组,然后将它们相加,即123+4+12,结果是139
这是我到目前为止尝试过的,但这不会导致字符串或整数组:
string[] strArr =
strFood .GroupBy(y => Char.IsDigit(y)).Select(y => y.ToString()).ToArray();
我也尝试了这个,但它返回一个字符串中的所有数字:
var foo = from a in strFood .ToCharArray() where Char.IsDigit(a) == true select a;
任何帮助都将不胜感激。我建议使用正则表达式通过Linq查找聚合的所有组(匹配项):
string strFood=“123d 4hello12”;
var sum=Regex
.Matches(strFood,“[0-9]+”///整数组
第()类
.Select(match=>int.Parse(match.Value))//将每个组视为整数
.Sum();//总结
如果要获取数组(并在后面总结):
int[]result=Regex
.Matches(strFood,“[0-9]+”///整数组
第()类
.Select(match=>int.Parse(match.Value))
.ToArray();
...
var sum=result.sum();
这将给出字符串中所有数字的总和
如果只需要一个IEnumerable整数,请从末尾删除
Sum()
,您可以将字符串拆分为整数集合:
string strFood = "123d 4hello12";
var integers = new Regex(@"\D").Split(strFood)
.Where(x=>!string.IsNullOrWhiteSpace(x))
.Select(x=>int.Parse(x));
然后加上:
var sum = integers.Sum(); // Result : 139
在@Dmitry Bychenko的评论后编辑:使用一些字符,例如无法使用的波斯数字。
解决方案:要么使用
new Regex(@"[^0-9+]")
或
试试这个:
int[] strArr = strFood.ToCharArray().Where(x=> Char.IsDigit(x)).Select(y => Convert.ToInt32(y.ToString())).ToArray();
为什么不使用一个简单的正则表达式呢
string input = "123d 4hello12";
int sum = System.Text.RegularExpressions.Regex.Matches(input, @"\d+").Cast<System.Text.RegularExpressions.Match>().Sum(m => Convert.ToInt32(m.Value));
string input=“123d 4hello12”;
int sum=System.Text.RegularExpressions.Regex.Matches(输入@“\d+”).Cast().sum(m=>Convert.ToInt32(m.Value));
只需在求和中添加十进制数,即可使用此正则表达式:
var str = "123d 4hello12and0.2plus.1and-1and2+8.but 1....1 a.b";
// ^^^ ^ ^^ ^^^ ^^ ^^ ^ ^ ^ ^^
var s = Regex
.Matches(str, @"-?([0-9]+|[0-9]*\.[0-9]+)")
.OfType<Match>()
.Sum(c=> double.Parse(c.Value, CultureInfo.InvariantCulture));
我尝试了使用
Split
和Join
的方法
首先,我使用LinqSelect
将非数字替换为“,”:
strFood.Select(ch => (Char.IsDigit(ch)) ? ch : ',');
然后我使用Join
将其转换回“123,4,,,,,,,12”形式的字符串,然后拆分this on”,“并过滤掉具有空字符串的值(使用其中),然后将字符串转换为一个数字,例如,“123”变为123,并对数组求和
把这一切放在一起就成了:
var Sum = String.Join("",(strFood.Select(c => (Char.IsDigit(c)) ? c : ',')))
.Split(',').Where(c => c != "").Select(c => int.Parse(c)).Sum();
下面是使用Concat的略短版本:
var Sum = String.Concat(strFood.Select(ch => (Char.IsDigit(ch)) ? ch : ','))
.Split(',').Where(c => c != "").Select(c => int.Parse(c)).Sum();
这给出了139个@devRicher”的结果,因为我的计划是获取数组,然后将它们全部添加到“使用.OfType()的很好的解决方案有一个奇怪的反例:string strFood=“۱۲۳۴”
(使用波斯数字)。然而,我怀疑实际数据是否能包含这样的字符……new Regex(@“\D”,RegexOptions.ECMAScript).
(解决波斯语、印度语和类似数字)双精度的模式(即使没有指数部分)应该更复杂;否则会有反例:“1…2”
,“a.b”
等等。当它带有括号时,你不必逃避:
,[0-9.]
(但你肯定可以这样做)@DmitryBychenko谢谢,我更新了我的答案以获得更大的灵活性;)。由于您使用
作为十进制分隔符,double.Parse(c.Value,CultureInfo.InvariantCulture)
将是更安全的选择(如果我在我的工作场所使用默认的俄罗斯文化运行您的代码,该文化使用,
作为十进制分隔符,
作为千分之一,那么1.2
将被视为12
,因为千分之一将被忽略)@DmitryBychenko再次感谢您,我没有注意到;)。与“char.IsDigit(char)”匹配的最佳重载方法具有一些无效参数。我希望您可以尝试此方法。谢谢
var str = "123d 4hello12and0.2plus.1and-1and2+8.but 1....1 a.b";
// ^^^ ^ ^^ ^^^ ^^ ^^ ^ ^ ^ ^^
var s = Regex
.Matches(str, @"-?([0-9]+|[0-9]*\.[0-9]+)")
.OfType<Match>()
.Sum(c=> double.Parse(c.Value, CultureInfo.InvariantCulture));
Count = 11
[0]: {123}
[1]: {4}
[2]: {12}
[3]: {0}
[4]: {.2}
[5]: {.1}
[6]: {-1}
[7]: {2}
[8]: {8}
[9]: {1}
[10]: {.1}
Sum = 149.39999999999998 //~= 149.4
strFood.Select(ch => (Char.IsDigit(ch)) ? ch : ',');
var Sum = String.Join("",(strFood.Select(c => (Char.IsDigit(c)) ? c : ',')))
.Split(',').Where(c => c != "").Select(c => int.Parse(c)).Sum();
var Sum = String.Concat(strFood.Select(ch => (Char.IsDigit(ch)) ? ch : ','))
.Split(',').Where(c => c != "").Select(c => int.Parse(c)).Sum();