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

rat*_*tty 10 c# regex string split

string sentence = "X10 cats, Y20 dogs, 40 fish and 1 programmer.";

 string[] digits = Regex.Split (sentence, @"\D+");
Run Code Online (Sandbox Code Playgroud)

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

string sentence = "X10.4 cats, Y20.5 dogs, 40 fish and 1 programmer.";

 string[] digits = Regex.Split (sentence, @"\D+");
Run Code Online (Sandbox Code Playgroud)

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

但我喜欢这样的10.4,20.5,40,1十进制数我怎么能这样做.

cod*_*ife 31

@ 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() != "");
Run Code Online (Sandbox Code Playgroud)

返回:

10.4
20.5
40
1
Run Code Online (Sandbox Code Playgroud)

最初的解决方案正在回归

[empty line here]
10.4
20.5
40
1
.
Run Code Online (Sandbox Code Playgroud)

  • .Where(w =>!String.IsNullOrEmpty(w))更优雅.(> = .net 4) (2认同)

Wik*_*żew 8

所述的十进制/浮点数提取的正则表达式可以根据是否以及使用的千分,什么符号表示十进制分隔,一个是否希望也匹配的指数,无论是否以匹配正或负号,不论是否是不同的匹配可能具有前导0省略的数字,无论是否提取以小数分隔符结尾的数字.

一个普通的正则表达式匹配最常见的十进制数类型中提供与正则表达式匹配浮点数:

[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?
Run Code Online (Sandbox Code Playgroud)

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

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

[-+]?[0-9]*[.,]?[0-9]+(?:[eE][-+]?[0-9]+)?
           ^^^^
Run Code Online (Sandbox Code Playgroud)

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

[-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)?
            ^
Run Code Online (Sandbox Code Playgroud)

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

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

[-+]?[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?
          ^
Run Code Online (Sandbox Code Playgroud)

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

现在,如果你不想在<digits>.<digits>里面匹配<digits>.<digits>.<digits>.<digits>怎么办?如何将它们作为整个单词匹配?使用外观:

[-+]?(?<!\d\.)\b[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.\d)
Run Code Online (Sandbox Code Playgroud)

这里有一个演示:

在此输入图像描述

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

[-+]?(?<![0-9]\.)\b[0-9]+(?:[,\s][0-9]+)*\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.[0-9])
Run Code Online (Sandbox Code Playgroud)

看看正则表达式演示:

在此输入图像描述

交换一个逗号,\.如果你需要使用逗号作为小数点分隔符和句点作为作为千个分隔符.

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

var results = Regex.Matches(input, @"<PATTERN_HERE>")
        .Cast<Match>()
        .Select(m => m.Value)
        .ToList();
Run Code Online (Sandbox Code Playgroud)


Mic*_*sov 5

尝试

Regex.Split (sentence, @"[^0-9\.]+")
Run Code Online (Sandbox Code Playgroud)