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

时间:2010-08-26 13:09:11

标签: c# regex string split

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我该怎么办呢。

7 个答案:

答案 0 :(得分:26)

@ 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
.

答案 1 :(得分:7)

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

Matching Floating Point Numbers with a Regular Expression中提供了通用正则表达式以匹配最常见的十进制数字类型

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

我只将捕获组更改为非捕获组(?:后添加()。 It matches enter image description here

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

[.,]

注意上面的表达式匹配整数和浮点数仅匹配浮点数/小数确保在[-+]?[0-9]*[.,]?[0-9]+(?:[eE][-+]?[0-9]+)? ^^^^ demo)之后移除第二个?,必须使用小数模式部分:

\.

现在,[-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)? ^ 未匹配:enter image description here已匹配。

如果您不想匹配没有前导零的浮点数(例如34,则必须使第一个数字匹配模式(通过添加.5量词)匹配1或更多出现的数字):

+

this demo。现在,它匹配更少的样本: enter image description here

现在,如果您不想匹配[-+]?[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)? ^ 内的<digits>.<digits>,该怎么办?如何匹配作为整个单词?使用 lookarounds

<digits>.<digits>.<digits>.<digits>

demo here

enter image description here

现在,那些拥有千位分隔符的浮点数,如[-+]?(?<!\d\.)\b[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.\d) 12 123 456.23呢?您可以在第一个34,345,767.678之后添加(?:[,\s][0-9]+)*,以匹配逗号或空格的零个或多个序列,后跟1个数字:

[0-9]+

请参阅regex demo

enter image description here

如果您需要使用逗号作为小数点分隔符,并使用句点作为千位分隔符,则使用逗号[-+]?(?<![0-9]\.)\b[0-9]+(?:[,\s][0-9]+)*\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.[0-9])

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

\.

答案 2 :(得分:5)

尝试

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

\d+(\.\d+)?

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

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

答案 5 :(得分:0)

如果你有Linq:

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

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

答案 6 :(得分:0)

以下信用转到@ 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;
    }