Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取字符串上的一组数字_C#_Regex_Linq - Fatal编程技术网

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
的方法

首先,我使用Linq
Select
将非数字替换为“,”:

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();