Regex de valor em reais (R$)
Regex de valor em reais com prefixo R$, milhar com ponto e vírgula decimal com duas casas, como R$ 1.234,56. Serve para achar e conferir valores em texto.
O padrão
R\$\s?(?:\d{1,3}(?:\.\d{3})*|\d+),\d{2}
Flags: nenhuma. Sem âncoras: para validar um campo inteiro use ^(?:padrão)$.
Teste na hora
| Linha | Resultado |
|---|
Tudo roda no seu navegador; nada do que você digita é enviado.
Exemplos
Casam
R$ 1.234,56R$0,99R$ 10,00R$ 1234567,89
Não casam
R$ 1,234.56R$ 1.23,451.234,56R$ 12,3R$ -5,00
Como funciona, por partes
R\$\s?: O prefixo R$, com o cifrão escapado, porque $ sozinho significa fim de texto. Um espaço opcional pode vir depois.\d{1,3}(?:\.\d{3})*: Primeira forma da parte inteira: de um a três dígitos, seguidos de zero ou mais grupos de ponto e três dígitos, que é o separador de milhar brasileiro.|\d+: Segunda forma: dígitos corridos, sem separador de milhar, como R$ 1234567,89. Muita gente escreve assim.,\d{2}: Vírgula decimal e exatamente dois dígitos de centavos.Sem sinal: O padrão não aceita sinal negativo. Valores negativos pedem um menos opcional depois do R$, por exemplo R\$\s?-?, conforme a convenção do seu sistema.
Armadilhas
- O padrão confere a forma de um valor com dois decimais; não converte em número. Para calcular, remova os pontos de milhar, troque a vírgula por ponto e só então converta, preferindo trabalhar em centavos inteiros.
- Valores sem o prefixo R$, como 1.234,56, não casam. Isso é intencional, para não confundir com outros números, mas pode exigir uma variante sem prefixo em planilhas.
- O formato americano (1,234.56) é recusado. Ao importar dados de sistemas estrangeiros, converta o formato antes de aplicar a regra brasileira.
- Valores como R$ 1.000.000,00 passam, mas R$ 1.0000,00 não. Mesmo assim, o regex não limita o tamanho do valor; defina um teto de negócio à parte.
Código pronto
JavaScript
const re = new RegExp("^(?:R\\$\\s?(?:\\d{1,3}(?:\\.\\d{3})*|\\d+),\\d{2})$");
console.log(re.test(texto.trim()));
Python
import re
re_valor_em_reais = re.compile(r"R\$\s?(?:[0-9]{1,3}(?:\.[0-9]{3})*|[0-9]+),[0-9]{2}")
print(bool(re_valor_em_reais.fullmatch(texto.strip())))
C#
using System.Text.RegularExpressions;
var re = new Regex(@"^(?:R\$\s?(?:[0-9]{1,3}(?:\.[0-9]{3})*|[0-9]+),[0-9]{2})\z");
bool ok = re.IsMatch(texto.Trim());
Perguntas frequentes
Como extrair todos os valores de um texto?
Use o regex sem âncoras e a flag g. Em JavaScript, texto.match(regex) devolve todos os valores encontrados. Depois converta cada um em centavos antes de somar.
Por que dois formatos de parte inteira?
Porque há quem escreva o milhar com ponto e quem escreva o número corrido. Aceitar os dois ajuda em textos reais, mas não aceita pontos fora de lugar, como 1.23.456.
E se o valor não tiver centavos?
Este padrão exige a vírgula e dois dígitos. Para aceitar R$ 10, torne a parte decimal opcional com (?:,\d{2})?, sabendo que isso também deixará passar números inteiros longos.
Como lidar com espaços estranhos?
Textos copiados de PDFs podem trazer o espaço sem quebra (código 160) entre o R$ e o número. O \s do padrão já cobre esse caso em JavaScript, mas confira o comportamento na linguagem que você usa.