我很抱歉,如果这篇文章是重复的,但我已经广泛搜索,似乎无法找到有效的解决方案.
我正在为C#编写正则表达式.以下是匹配的标准:
几个例子:
1,024.12
500.00
10,456.23
2.89
(8,456.15)
(1.63)
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的当前模式:
^\(?\d+\,?\d+[.]{1}\d{2}\)?
Run Code Online (Sandbox Code Playgroud)
我认为这种模式可以解决这个问题,但是,在同一行上有一个由数字和句点构成的字符串,与此模式相匹配.例:
123.1234.12345.123456789.12345.123
Run Code Online (Sandbox Code Playgroud)
我知道这是非常基本的东西但是我很难让它只匹配货币部分而不是上面的字符串.
感谢您提供的任何建议
您当前的表达式与列表中的第四个2.89和第六个示例不匹配(1.63).
相反,您可以使用以下表达式:
^(\()?[0-9]+(?>,[0-9]{3})*(?>\.[0-9]{2})?(?(1)\))$
Run Code Online (Sandbox Code Playgroud)
此表达式匹配行首^,然后它尝试匹配(负数的可选括号,括号将在一个组中捕获,原因很快就会被清除.
现在,它试图匹配一个或多个数字[0-9]+,这应该涵盖所有整数一样234,5652等.
然后它会查找一个可能的逗号(千位分隔符), ,然后是(?>,[0-9]{3})*重复零次或多次的3位数,这将覆盖包含千位分隔符的数字.
然后它试图找到一个小数点,.后跟正好2位数(?>\.[0-9]{2})?,这当然是可选的,这包括十进制数.
在那之后,表达式使用(?(1)\)) - 条件构造(?(id/name)yes-pattern|no-pattern)-这样如果我们实际上匹配一个开括号,那么我们应该匹配一个结束的,这可以防止表达式匹配不正确的负数,例如(2.4没有右括号.
最后是字符串的结尾,$以防止部分匹配,例如你的上一个例子.