REGEX: ^\d{1,3}(?:(?:\.\d{3})*|(?:\d{3})*)(?:,\d{1,4})?$
Explicação:
\d{1,3}
: os números mais a esquerda podem ser de 0 a 999(?:(?:\.\d{3})*|(?:\d{3})*)
: garante que o separador de milhar seja sempre usado ou nunca. Quebrando em duas partes:(?:\.\d{3})*
: ou tem um ponto seguido de 3 números repetidos de 0 a N vezes(?:\d{3})*
: ou tem apenas 3 números repetidos de 0 a N vezes
(?:,\d{1,4})?
: opcionalmente, ao fim da string, haverá uma vírgula seguida de 1, 2, 3 ou 4 números