如何从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.23
或34,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; }