Regex de linha digitável de boleto (47 dígitos)
Regex para a linha digitável de boleto bancário de 47 dígitos, com a pontuação e os espaços dos campos ou só os números. Não verifica os dígitos de controle.
O padrão
\d{5}\.\d{5} \d{5}\.\d{6} \d{5}\.\d{6} \d \d{14}|\d{47}
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
34191.00000 00000.000000 00000.000000 1 000000000000003419100000000000000000000000000010000000000000023790.12345 67890.123456 78901.234567 8 0000001234567823790123456789012345678901234567800000012345678
Não casam
341910000000000000000000000000001000000000000034191000000000000000000000000000100000000000000934191,00000 00000.000000 00000.000000 1 0000000000000034191.0000000000.00000000000.000000100000000000000abc91000000000000000000000000000100000000000000
Como funciona, por partes
\d{5}\.\d{5}: Campo 1 da linha formatada: cinco dígitos, ponto e mais cinco dígitos. Inclui o código do banco, a moeda e parte do campo livre.\d{5}\.\d{6} \d{5}\.\d{6}: Campos 2 e 3, separados por espaços: cinco dígitos, ponto e seis dígitos, duas vezes. Cada campo termina em um dígito verificador próprio.\d \d{14}: Campo 4, o dígito verificador geral do código de barras, e campo 5, com 14 dígitos que trazem o fator de vencimento e o valor.|\d{47}: Alternativa sem pontuação: quarenta e sete dígitos corridos, como muitos sistemas guardam e como aparecem após copiar de aplicativos.Só boleto bancário: Boletos de arrecadação e contas de consumo têm 48 dígitos e estrutura diferente. Este padrão não os reconhece.
Armadilhas
- O regex confere somente o formato. Os dígitos verificadores dos três primeiros campos e o geral seguem cálculos próprios, e só a ferramenta de decodificação os confere. As linhas dos exemplos têm formato correto, mas não foram emitidas por banco algum.
- Boletos de convênio e concessionárias têm 48 dígitos. Se o seu sistema recebe os dois tipos, adicione uma alternativa específica em vez de alargar este padrão.
- Linhas digitáveis copiadas de PDFs costumam vir com espaços a mais, quebras de linha ou pontos em outros lugares. Normalize (remover tudo que não é dígito) antes de testar o formato de 47 dígitos.
- O valor e o vencimento ficam nos últimos 14 dígitos, mas decodificá-los exige regras, como o fator de vencimento, que o regex não aplica.
Código pronto
JavaScript
const re = new RegExp("^(?:\\d{5}\\.\\d{5} \\d{5}\\.\\d{6} \\d{5}\\.\\d{6} \\d \\d{14}|\\d{47})$");
console.log(re.test(texto.trim()));
Python
import re
re_linha_digitavel_boleto_47 = re.compile(r"[0-9]{5}\.[0-9]{5} [0-9]{5}\.[0-9]{6} [0-9]{5}\.[0-9]{6} [0-9] [0-9]{14}|[0-9]{47}")
print(bool(re_linha_digitavel_boleto_47.fullmatch(texto.strip())))
C#
using System.Text.RegularExpressions;
var re = new Regex(@"^(?:[0-9]{5}\.[0-9]{5} [0-9]{5}\.[0-9]{6} [0-9]{5}\.[0-9]{6} [0-9] [0-9]{14}|[0-9]{47})\z");
bool ok = re.IsMatch(texto.Trim());
Perguntas frequentes
Qual a diferença entre linha digitável e código de barras?
A linha digitável tem 47 dígitos e é o que se digita; o código de barras tem 44 dígitos, em outra ordem, e é lido pelo leitor óptico. Os dois representam o mesmo boleto e dá para converter de um para o outro.
Como confiro se o boleto está correto?
Cole a linha na ferramenta de decodificação de boleto, que valida os dígitos de controle e mostra banco, valor e vencimento. O regex serve antes, para recusar texto que nem parece um boleto.
Por que guardar só os 47 dígitos?
Porque a pontuação é só apresentação. Com os dígitos puros, comparar duas linhas e achar duplicidade fica trivial.