使用正则表达式 C# 从字符串中获取十进制值

Posted

技术标签:

【中文标题】使用正则表达式 C# 从字符串中获取十进制值【英文标题】:Get decimal value from string using regex C# 【发布时间】:2018-11-01 05:11:26 【问题描述】:

我想提取输入字符串的十进制值

Total (pre tax) 93.78 EUR

我试过了

Regex.Replace(string input, "[^0-9]+", string.Empty)

但它只提取了9370,其中预期的结果是93.78

请帮助我获取十进制值的模式。

【问题讨论】:

试试 [0-9]*\.?[0-9]+ how do extract decimal number from string in c#的可能重复 试试Regex.Replace(string input, "[^\d\.]", string.Empty),如果小数可能是负值,试试Regex.Replace(string input, "[^\d\.-]", string.Empty) 正如 Dmitry Bychenko 在他的回答中指出的那样......为什么你要删除你不需要的所有东西,而不是简单地匹配你确实需要的部分? 【参考方案1】:

我建议匹配而不是替换:让我们提取感兴趣的值,而不是删除所有其他角色。

string result = Regex.Match(
     "Total (pre tax) 93.78 EUR", 
    @"[0-9]+(\.[0-9]+)?")
  .Value;

【讨论】:

【参考方案2】:

您当前正在替换所有不是数字的内容 - 包括 .

我建议您使用可选的“点后跟更多数字”来捕获数字组。这样,您也可以从文本中捕获多个值 - 或者根据您拥有的任何标准在需要时拒绝它。这是一个例子:

using System;
using System.Text.RegularExpressions;

class Program

    public static void Main()        
    
        string text = "I start with 5 and take away 2.52 to get 2.48 as a result";
        Regex regex = new Regex(@"\d+(\.\d+)?");
        var matches = regex.Matches(text);
        foreach (Match match in matches)
        
            Console.WriteLine(match.Value);
        
    

输出:

5
2.52
2.48

您可以使用MatchCollection.Count 来确定有多少匹配项 - 我们不知道您的上下文,但您可能希望根据没有匹配项、只有一个匹配项还是多个匹配项采取不同的操作匹配。

【讨论】:

【参考方案3】:

如果您将'.' 添加到您希望保留的字符列表中,即[^0-9.],您可以使用您的方法作为快速破解。但是,这还不够健壮,因为它会保留其他数字,例如

Total (inclusive of 20% VAT) 93.78 EUR

会产生2093.78,这不是您要找的。​​p>

更好的方法是使用特定于价格的正则表达式,例如

@"(\d+[.,]\d\d) EUR"

将匹配带有两位小数的数字,当它后跟EUR

【讨论】:

【参考方案4】:

对于整数或浮点数:

string result = Regex.Match(input,@"[0-9]+(\.[0-9]+)?").Value;

仅适用于浮动:

string result = Regex.Match(input,@"[0-9]+\.[0-9]+").Value;

【讨论】:

【参考方案5】:

Regex.Split() 会从输入字符串中提取所有浮点值并存入string[],就像string.Split函数一样简单

你可以试试这个:

string stringInput = "Total (pre tax) 93.78 EUR";
string[] splitValue = Regex.Split (stringInput , @"[^0-9\.]+");
foreach(string item in splitValue)

    //Here you can convert it to decimal
    Console.WriteLine(item);

输出:

93.78

DotnetFiddler

【讨论】:

【参考方案6】:
string input = "Java JDK 12.0.1";
var result = Regex.Matches(input, @"[0-9]+(\.[0-9]\.[0-9]+)?");

结果:1​​2.0.1

【讨论】:

以上是关于使用正则表达式 C# 从字符串中获取十进制值的主要内容,如果未能解决你的问题,请参考以下文章

在c#中使用/不使用正则表达式清除不需要的十六进制字符[重复]

正则表达式 - 从字符串中仅获取十进制数

C#正则表达式如何从字符串中排除

正则表达式 c# 获取捕获组的子组

C#当中如何使用正则表达式获取某一标签的所有属性 属性数量不确定

C#:更改正则表达式的 NumberDecimalSeparator