Skip to main content
 首页 » 编程设计

c#之货币的正则表达式(没有美元符号,有逗号,有小数,可选的负数括号)

2024年01月13日31bonelee

如果这篇文章重复,我深表歉意,但我进行了广泛的搜索,似乎找不到有效的解决方案。

我正在研究 C# 的正则表达式。以下是要匹配的标准:

  • 货币
  • 没有美元符号
  • 1000 分隔符的逗号
  • 十进制
  • 小数点后两位数
  • 负数括号

几个例子:

  1,024.12 
    500.00 
 10,456.23 
      2.89 
 (8,456.15) 
     (1.63) 

这是我目前使用的模式:

^\(?\d+\,?\d+[.]{1}\d{2}\)? 

我认为这种模式可以解决问题,但是,在同一行上有一个由数字和句点组成的字符串与这种模式相匹配。示例:

123.1234.12345.123456789.12345.123  

我知道这是非常基本的东西,但我很难让它只匹配货币部分而不匹配上面的字符串。

感谢您提供的任何建议

请您参考如下方法:

您当前的表达式与列表中的第四个 2.89 和第六个示例 (1.63) 不匹配。

您可以使用以下表达式:

^(\()?[0-9]+(?>,[0-9]{3})*(?>\.[0-9]{2})?(?(1)\))$ 

这个表达式匹配行首 ^,然后它尝试匹配一个可选的括号 ( 对于负数,括号被捕获在一个组中是有原因的很快就会被清除。

现在它尝试匹配一个或多个数字 [0-9]+,这应该涵盖所有整数,例如 234、5652等..

然后它会寻找可能的逗号 (千位分隔符) , 后跟 3 位数字 (?>,[0-9]{3})* 重复零次或多次,这包括包含千位分隔符的数字。

然后它试图找到一个小数点 . 后跟恰好 2 位数字 (?>\.[0-9]{2})? 这当然是可选的,这包括十进制数。

之后,表达式使用 (?(1)\)) - 条件构造 (?(id/name)yes-pattern|no-pattern) - 这样,如果我们实际上匹配了一个左括号,那么我们应该匹配一个右括号,这可以防止表达式匹配不正确的负数,例如没有右括号的 (2.4。

最后是字符串结尾 $ 以防止部分匹配,例如您的上一个示例。

Regex 101 Demo