Expressão regular - Regex para valor monetario

Bom, estou usando o rubular.com para criar umas expressões regular para tentar criar uma regex que preencha o que é pedido nesse enunciado:

> O método deve utilizar expressões regulares para validar se o formato do parâmetro recebido é um preço em Real ou Dólar.
> Preços em Real:
> devem começar com R$.
> podem ter um único espaço entre o símbolo da moeda e o valor.
> devem ter duas casas decimais.
> devem utilizar . como separador de milhar.
> devem utilizar , como separador decimal.
> Preços em Dólar:
> devem começar com U$.
> podem ter um único espaço entre o símbolo da moeda e o valor.
> devem ter duas casas decimais.
> devem utilizar , como separador de milhar.
> devem utilizar . como separador decimal.

estou criando algo do tipo:


^(R|U)$(\s)?\d{1,3}(,|.)\d{3}*(,|.)\d{2}$


para esses possíveis valores (no teste tem mais, com mais casas de centenas)

R$ 1.982,03 (true)
R$ 123,78 (true)
R$1.982,03 (true)
R$ 1.938.093,33 (true)
U$ 298,927,831,092.93 (true)
U$ 3.039 (true)
R$ 1,938.093,33 (false)
U$ 298,927,831,092.93 (true)

a minha dificuldade é encontrar um método de dar match em um valor com muitas casas decimais, alguém poderia me ajudar?

sua expressao esta errada. reais e dolar tem regras bem diferentes.

deveria ser algo como

^(R\$ ?\d{1,3},\d{2}|U\$ ?\d{1,3}\.\d{2})$

primeira parte R\$ ?\d{1,3},\d{2}

segunda parte U\$ ?\d{1,3}\.\d{2}

perceba que esta incompleto pq vc tem a parte dos milhares pra pensar.

eu acho que vc tem que fazer um sub-grupo.

um com \d{1,3} e outro com \d{1,3}\.\d{3}

e ai tem que pensar que vc pode ter varios \d{3}

Cara consegui aqui, realmente tava pensando errado.

utilizei

^R$ ?(\d{1,3}.)?\d{1,3},\d{2}$|^U$ ?(\d{1,3},)?\d{1,3}.\d{2}$


deu match em tudo que eu precisava. :smiley:

tem um problema a sua ER. isso vai passar:

R$ 100.10,00

acho q vc quer algo assim

^(R$ ?\d{1,3}(.\d{3}),\d{2}|U$ ?\d{1,3}(,\d{3}).\d{2})$

Real R\$ ?\d{1,3}(\.\d{3})*,\d{2}
Dolar U\$ ?\d{1,3}(,\d{3})*\.\d{2}

pois vc pode ter 1, 10 ou 100 dolares ( ou reais ) mas depois disso vc sempre tem .3 numeros Zero ou varias vezes