[0-9]?+
- это шаблон, который соответствует 1 или 0 цифрам собственно , не позволяя вернуться к шаблону. Регулярное выражение JS не поддерживает собственнические квантификаторы , следовательно, проблема.
Вам нужно использовать
^[0-9]*(?:,[0-9]{3})*\.[0-9]{2}$
Или
^(?:[0-9]+(?:,[0-9]{3})*)?\.[0-9]{2}$
Здесь [0-9]*
соответствует нулю или более цифрам, а (?:[0-9]+(?:,[0-9]{3})*)?
соответствует необязательной последовательности из 1+ цифр, за которой следуют 0+ повторений ,
и трехзначных групп.
См. это демо регулярных выражений .
A более точный шаблон будет ограничивать первый разряд цифрой до 1, 2 или 3 цифр и делать целую часть необязательной:
^(?:[0-9]{1,3}(?:,[0-9]{3})*)?\.[0-9]{2}$
См. Демоверсию regex .
Детали
^
- начало строки
(?:[0-9]{1,3}(?:,[0-9]{3})*)?
- необязательная последовательность
[0-9]{1,3}
- от одной до трех цифр
(?:,[0-9]{3})*
- 0 или более повторений
,
- запятая
[0-9]{3}
- три цифры
\.
- точка
[0-9]{2}
- две цифры
$
- конец строки.