Я думаю, что ваше регулярное выражение слишком сложно в любом случае.Я бы использовал что-то более простое, например
^[1-9]\d*(\.\d*)?$
, в котором говорится, что нет нуля в начале, хотя бы одно число перед десятичной запятой и необязательная десятичная точка, за которой следуют дополнительные числа.
Редактировать
^\$?([1-9]\d?\d?((,\d{3})*|(\d{3})*)|0?)(\.\d*)?$
Для проверки
var r = /^\$?([1-9]\d?\d?((,\d{3})*|(\d{3})*)|0?)(\.\d*)?$/;
var shouldMatch = ["$30,000.00", "30,000.00", "9,000.00", "9000", "1", ".12"];
var shouldntMatch = ["30,000000.00", "1.00c", "19,00.00", "$30,00"];
function test1() {
for (var i in shouldMatch) {
if (!r.exec(shouldMatch[i])) {
alert(shouldMatch[i]);
return;
}
}
}
function test2() {
for (var i in shouldntMatch) {
if (r.exec(shouldntMatch[i])) {
alert(shouldntMatch[i]);
return;
}
}
}
test1();
test2();