Skip to content

Instantly share code, notes, and snippets.

@imaginamundo
Last active April 6, 2024 22:46
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • 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

(?:(^\+\d{2})?)(?:([1-9]{2})|([0-9]{3})?)(\d{4,5})(\d{4})

Pequena explicação

  • (?:(^\+\d{2})?)

    • Busca por um + seguido por dois números, opcional.
  • (?:([1-9]{2})|([0-9]{3})?)

    • Busca por dois números de 1 à 9, ou três números de 0 à 9, isso faz a diferença entre o DDD com zero e DDD sem zero, lembrando que nenhum código de cidade tem o digito 0. Também opcional.
  • (\d{4,5})(\d{4})

    • Segue buscando por dois grupos de números, um de 5 ou 4 digitos, que diferencia números de celular e telefones fixos (celulares tem o digito 9 a mais no começo), e os últimos números que são sempre 4 digitos segundo o padrão de números de telefones do Brasil.

Como usar

function (str) {
    return str
        .replace(/\D/g, '')
        .replace(/(?:(^\+\d{2})?)(?:([1-9]{2})|([0-9]{3})?)(\d{4,5})(\d{4})/,
            (fullMatch, country, ddd, dddWithZero, 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]
  • 01100000000

    • [011][0000][0000]
    • [dddWithZero][prefixTel][Suffixtel]
  • 011900000000

    • [011][90000][0000]
    • [dddWithZero][prefixTel][Suffixtel]
  • +551100000000

    • [+55][11][0000][0000]
    • [country][ddd][prefixTel][Suffixtel]
  • +5511900000000

    • [+55][11][90000][0000]
    • [country][ddd][prefixTel][Suffixtel]
  • +5501100000000

    • [+55][011][0000][0000]
    • [country][dddWithZero][prefixTel][Suffixtel]
  • +55011900000000

    • [+55][011][90000][0000]
    • [country][dddWithZero][prefixTel][Suffixtel]

Exemplos da vida real

Formatar telefone

function formatPhone(str) {
    return str
        .replace(/\D/g, '')
        .replace(/(?:(^\+\d{2})?)(?:([1-9]{2})|([0-9]{3})?)(\d{4,5})(\d{4})/,
            (fullMatch, country, ddd, dddWithZero, prefixTel, suffixTel) => {
                if (country) return `${ country } (${ ddd || dddWithZero }) ${ prefixTel }-${ suffixTel}`;
                if (ddd || dddWithZero) return `(${ ddd || dddWithZero }) ${ 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: 0000000000

Output: (00) 0000-0000


Input: 00000000000

Output: (00) 00000-0000

Corrigir

  • Melhorar regex para remover caracteres não permitidos, a parte do código .replace(/\D/g, '') remove todos os caractéres que não são número [0-9]. Permitir +.
@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})"

:)

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