Лучшее, что мы можем придумать, это:
^\\$?(([1-9](\\d*|\\d{0,2}(,\\d{3})*))|0)(\\.\\d{1,2})?$
Я понимаю, что это может показаться слишком большим, но, насколько я могу проверить, оно соответствует всему, что человеческий глаз примет в качестве действительной стоимости валюты, и отсеет все остальное.
Соответствует этим:
1 => true
1.00 => true
$1 => true
$1000 => true
0.1 => true
1,000.00 => true
$1,000,000 => true
5678 => true
И отсеивает это:
1.001 => false
02.0 => false
22,42 => false
001 => false
192.168.1.2 => false
, => false
.55 => false
2000,000 => false