使用C#中的正则表达式在字母数字字符串中提取带有千位分隔符和小数点的数字部分

时间:2018-11-24 06:37:19

标签: c# regex

我试图仅提取包括千位分隔符和十进制值在内的数字部分,但始终会以错误的格式获取错误的输入字符串。

我的输入字符串将采用以下格式

  

1200美元1,200.12美元

我分别需要以下输出

  

1200 1,200.12

如果我在下面使用,则第一次出现时,被视为定界符

import os
process_names= ["script1.py", "script2.py", "script3.py"]  # change this to the name of your process

tmp = os.popen("ps -Af").read()
for process_name in process_names
    if process_name not in tmp[:]:
        print ("The {0} is not running.".format(process_name)) #this is in python 3x style
    else:
        print ("The {0} is running.".format(process_name))

如果我使用这个,我会报错

string prodValue = Regex.Match(prodAmount, @"\d+").Value;

如何提取所需的输出?

4 个答案:

答案 0 :(得分:2)

要捕获多个匹配项,您需要Regex.Matches而不是Regex.Match。另外,在正则表达式中,您需要将逗号组设置为零个或多个出现,并将点组设置为可选项,因为要捕获的数字可能存在也可能不存在。

您可以使用此正则表达式,

\d+(?:,\d+)*(?:\.\d+)?

说明:

  • \d+->匹配一个或多个数字
  • (?:,\d+)*->匹配一个逗号,后跟一个或多个数字零次或多次
  • (?:\.\d+)?->(可选)匹配文字点后跟一个或多个数字

Demo

这是示例C#代码,

MatchCollection matches = Regex.Matches("USD1200 1,200.12 1,211,234,332.12 12,333 USD", @"\d+(?:,\d+)*(?:\.\d+)?");
for (int i = 0; i < matches.Count;i++) {
    Console.WriteLine("Match: " + matches[i]);
}

这将提供您期望的以下输出,

Match: 1200
Match: 1,200.12
Match: 1,211,234,332.12
Match: 12,333

答案 1 :(得分:0)

我认为您错误地输入了第二个“ +”,而错过了第三个。

@"^[0-9]+,[0-9]+\.[0-9]+?$")

答案 2 :(得分:0)

Regex的匹配字符串不正确。

尝试:^[0-9]+((,[0-9]+)+)?(\.[0-9]+)?$

See example here

答案 3 :(得分:0)

在正则表达式中,您使用锚点^来声明字符串$的开始和结尾USD,其中(,[0-9]+)*未被考虑并且不匹配。如果要进行多次匹配,则应改用Regex.Matches。

要匹配不带点或逗号的数字,中间部分应该匹配0+次,因为最后一部分已经是可选的,并且字符类中的数字需要一个量词来匹配1+次,例如USD 。请注意,您不必转义逗号。

如果\bUSD(?<n1>\d+)|(?<n2>\d{1,3}(?:,\d{3})*(?:\.\d+)?) USD\b是匹配项的一部分,则可以使用替代项来匹配USD1200或1,200.12 USD,而不是匹配所有数字。

您可以使用命名捕获组来按名称引用该组。

\bUSD

那会匹配

  • (?<n1>\d+)匹配单词边界和USD
  • n1命名为捕获组|,它将匹配1个以上的数字
  • (?<n2>
  • n2开始命名捕获组\d{1,3}
    • (?:,\d{3})*匹配1-3位数字
    • (?:\.\d+)?匹配一个逗号,3位数字并重复0次以上
    • )匹配点和1个以上的数字并使其可选
  • USD\b关闭命名的捕获组
  • $text = Hello, this is example text. 匹配空格,USD和单词边界

Regex demo | C# demo