如何从c#中的字符串中提取十进制数

string sentence = "X10 cats, Y20 dogs, 40 fish and 1 programmer."; string[] digits = Regex.Split (sentence, @"\D+"); 

对于这个代码,我得到数字数组中的值,如10,20,40,1

 string sentence = "X10.4 cats, Y20.5 dogs, 40 fish and 1 programmer."; string[] digits = Regex.Split (sentence, @"\D+"); 

对于这个代码,我得到数字数组中的值,如10,4,20,5,40,1

但我喜欢这样的10.4,20.5,40,1十进制数如何才能做到这一点。

@ Michael解决方案的小改进:

 // NOTES: about the LINQ: // .Where() == filters the IEnumerable (which the array is) // (c=>...) is the lambda for dealing with each element of the array // where c is an array element. // .Trim() == trims all blank spaces at the start and end of the string var doubleArray = Regex.Split(sentence, @"[^0-9\.]+") .Where(c => c != "." && c.Trim() != ""); 

返回:

 10.4 20.5 40 1 

最初的解决方案正在回归

 [empty line here] 10.4 20.5 40 1 . 

尝试

 Regex.Split (sentence, @"[^0-9\.]+") 

十进制/浮点数提取正则表达式可以是不同的,取决于是否使用千位分隔符,什么符号表示小数分隔符,是否还想匹配指数,是否匹配正号或负号,是否匹配可能省略前导0数字,无论是否提取以小数分隔符结尾的数字。

匹配具有正则表达式的 浮点数时, 通用正则表达式匹配最常见的十进制数字类型

 [-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)? 

我只将捕获组更改为非捕获组(添加?: after ( )。 它匹配 在此处输入图像描述

如果你需要使它更通用, 如果小数点分隔符可以是点或逗号 ,则替换\. 使用字符类(或括号表达式) [.,]

 [-+]?[0-9]*[.,]?[0-9]+(?:[eE][-+]?[0-9]+)? ^^^^ 

请注意,上面的表达式匹配整数和浮点数要仅匹配浮点数/十进制数,请确保通过删除第二个来确定小数模式部分是否必须? 之后\. ( 演示 ):

 [-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)? ^ 

现在, 34不匹配: 在此处输入图像描述 匹配。

如果您不想匹配不带前导零的浮点数(如.5 ),则必须使第一个数字匹配模式成为必需(通过添加+量词,以匹配1个或更多个数字):

 [-+]?[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)? ^ 

看这个演示 。 现在,它匹配更少的样本: 在此处输入图像描述

现在,如果您不想匹配. ...怎么办? 如何将它们作为整个单词匹配? 使用外观

 [-+]?(? 

这里有一个演示 :

在此处输入图像描述

那么,那些有千个分隔符的浮标,如12 123 456.2334,345,767.678呢? 您可以在第一个[0-9]+之后添加(?:[,\s][0-9]+)*以匹配逗号或空格的零个或多个序列,后跟1+个数字:

 [-+]?(? 

看看正则表达式演示 :

在此处输入图像描述

\.替换逗号\. 如果你需要使用逗号作为小数分隔符和句点作为千分隔符。

现在,如何在C#中使用这些模式?

 var results = Regex.Matches(input, @"") .Cast() .Select(m => m.Value) .ToList(); 

检查大多数编程语言的语法词法分析器是否为小数的正则表达式。 将该正则表达式与字符串匹配,找到所有匹配项。

如果你有Linq:

 stringArray.Select(s=>decimal.Parse(s)); 

一个foreach也会工作。 您可能需要检查每个string实际上是一个数字( .Parse不会抛出exception)。

您需要在正则表达式中允许小数位。 请尝试以下方法:

 \d+(\.\d+)? 

这将匹配数字而不是数字以外的所有数字,但迭代匹配以构建数组应该很简单。

要记住的是你是否也应该寻找负号,逗号等。

以下信用转到@ code4life。 我添加的只是一个for循环,用于在返回之前解析整数/小数。

  public string[] ExtractNumbersFromString(string input) { input = input.Replace(",", string.Empty); var numbers = Regex.Split(input, @"[^0-9\.]+").Where(c => !String.IsNullOrEmpty(c) && c != ".").ToArray(); for (int i = 0; i < numbers.Length; i++) numbers[i] = decimal.Parse(numbers[i]).ToString(); return numbers; }