Skip to content

Instantly share code, notes, and snippets.

@imaginamundo
Last active May 20, 2025 13:40
Show Gist options
  • Save imaginamundo/d689b211e640f40d445a9146fdace407 to your computer and use it in GitHub Desktop.
Save imaginamundo/d689b211e640f40d445a9146fdace407 to your computer and use it in GitHub Desktop.
Regex para padrões de telefones brasileiros com explicação e como usar

Regex para telefones do Brasil

^(55)?(?:([1-9]{2})?)(\d{4,5})(\d{4})$

const regex = /^(55)?(?:([1-9]{2})?)(\d{4,5})(\d{4})$/;

Explicação

  • ^(55)?:

    • Código do país;
    • Exemplo: 55;
    • Opcional.
  • (?:([1-9]{2}))?):

    • Código da cidade;
    • Busca por dois números de 1 à 9.
    • Exemplo: 11
    • Opcional.
  • (\d{4,5})(\d{4}):

    • Número de telefone fixo ou celular;
    • Segue buscando por dois grupos de números, um de 5 ou 4 digitos, que diferencia números de telefones fixos e celulares, e os últimos números que são sempre 4 digitos;
    • Exemplo: 00000000 (8 digitos) ou 000000000 (9 digitos).

Como usar

/**
 * Regex groups for phone format.
 * @param {string} str - The phone number.
 * @returns {string} The str parameter with only numbers.
 */
function (str) {
  const regex = /^(55)?(?:([1-9]{2})?)(\d{4,5})(\d{4})$/;
  return str
    .replace(/\D/g, '')
    .replace(regex,
      (fullMatch, country, ddd, prefixTel, suffixTel) => {
        return fullMatch;
      }
    );
}

Com esse regex você conseguê a separação por código do país, código da cidade, prefixo e sufixo do telefone.

Capacidades numéricas:

  • 1100000000

    • [11][0000][0000]
    • [ddd][prefixTel][suffixTel]
  • 11900000000

    • [11][90000][0000]
    • [ddd][prefixTel][suffixTel]
  • 00000000

    • [0000][0000]
    • [prefixTel][suffixTel]
  • 900000000

    • [90000][0000]
    • [prefixTel][suffixTel]
  • 551100000000

    • [55][11][0000][0000]
    • [country][ddd][prefixTel][suffixTel]
  • 5511900000000

    • [55][11][90000][0000]
    • [country][ddd][prefixTel][suffixTel]

Exemplos da vida real

Formatar telefone

/**
 * Format phone.
 * @param {string} str - The phone number.
 * @returns {string} Formated phone.
 */
function formatPhone(str) {
  const regex = /^(55)?(?:([1-9]{2})?)(\d{4,5})(\d{4})$/;
  return str
    .replace(/\D/g, '')
    .replace(regex,
      (fullMatch, country, ddd, prefixTel, suffixTel) => {
        if (country) return `+${ country } (${ ddd }) ${ prefixTel }-${ suffixTel}`;
        if (ddd) return `(${ ddd }) ${ prefixTel }-${ suffixTel}`;
        if (prefixTel && suffixTel) return `${ prefixTel }-${ suffixTel }`;
        return str;
      }
    );
}

Essa função irá retornar os números assim:

Input: 00000000

Output: 0000-0000


Input: 000000000

Output: 00000-0000


Input: 1100000000

Output: (11) 0000-0000


Input: 551100000000

Output: +55 (11) 0000-0000

@vhs94
Copy link

vhs94 commented Apr 6, 2024

Opa! Tive que fazer um pequeno ajuste pra reconhecer ponto, traço ou qualquer caracter no meio do telefone.

ex.: 91234-5678, 91234.5678 ou ainda 91234 5678

Caso ajude, a regex ficou: "(?:(^\\+\\d{2})?)(?:([1-9]{2})|([0-9]{3})?)(\\d{4,5}).?(\\d{4})"

:)

@JoaoCapoAlm
Copy link

JoaoCapoAlm commented May 12, 2025

Segue melhoria, com o regex abaixo é removido alguns parênteses desnecessários, move ^ para o início da verificação e deixa de ser opcional, adiciona $ no final para verificar se terminou a string, na parte do DDD, caso seja aberto o parênteses, será necessário adicionar o parênteses fechando e como é para ser um padrão brasileiro, foi fixado o DDI como 55, deixando o + como opcional.
Validação: ^(?:\+?55\s?)?(?:(\([1-9]{2}\))|\d{2})\s?(?:[9]\d{4}|\d{4})[\s.-]?\d{4}$
Mascara JavaScript

const numero = '5511999999999';
const regexMask = /^(\+?55\s?)?((\([1-9]{2}\))|\d{2}\s?)([9]\d{4}|\d{4})[\s.-]?(\d{4})$/
numero.replace(/\D/g, '').replace(regexMask , '+$1 ($2)$3 $4-$5')

@imaginamundo
Copy link
Author

imaginamundo commented May 12, 2025

Obrigado pelas respostas.
Atualizei para deixar o 55 fixo no começo.
Removi a possibilidade de 0 no começo de código de cidade, pesquisei e vi que isso não existe.
Vou deixar como padrão remover tudo que não é número, assim não preciso tratar parenteses, sinal de + do país, espaços, traços ou pontos.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment