1

我想要一个可以处理与金钱相关的数字的正则表达式。目前我正在使用这个:

^\$?(?:\d+|\d{1,3}(?:,\d{3})*)(?:\.\d{1,2}){0,1}$

我的测试集包括以下数字,我希望将其声明为有效。我还提到了每个数字,使用上述正则表达式验证时的验证结果是什么:

123456789012345 //valid
123456789012345.34 //valid

123,456,789,012,345 //valid
123,456,789,012,345.34 //valid

-123,456,789,012,345 //not valid
-123,456,789,012,345.34 //not valid

它似乎适用于除负值之外的所有内容。

其次,它似乎$在一开始就对值起作用。是否可以将其修改为USD$在开始时接受,而不是仅接受$,以便以下数字有效?:

USD$123,456,789,012,345
USD$123,456,789,012,345.34
4

2 回答 2

3

要同时匹配负数,并匹配USD$ 而不是$
可以^\$?^(?:USD\$)?-?

于 2013-02-17T17:19:38.633 回答
1

实际上,这真的很容易:

^(?:(?:USD)?\$)?(?:-)?(?:\d+|\d{1,3}(?:,\d{3})*)(?:\.\d{1,2})?$

我已替换\$?为:

(?:(?:USD)?\$)?- 这匹配一个可选的 -$符号,可选地USD在它前面

并补充说:

(?:-)?- 这匹配-第一个数字之前的可选

最后,我还将 缩写{0,1}?。这是同一件事。

正则表达式演示

如果您想消除一些混乱,根据 Bergi 的评论,您可以稍微简化一下:

^((USD)?\$)?-?(?:\d+|\d{1,3}(?:,\d{3})*)(?:\.\d{1,2})?$

我不想碰其他非捕获组。

于 2013-02-17T17:20:37.187 回答