如果这篇文章重复,我深表歉意,但我进行了广泛的搜索,似乎找不到有效的解决方案。
我正在研究 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。
最后是字符串结尾 $ 以防止部分匹配,例如您的上一个示例。
