Esta solução valida estes formatos: 00000000000, 00000000000000, 000.000.000-00, 00.000.000/0000-00 e até 000000000-00 ou 00000000/0000-00, por exemplo. Os pontos e traços são opcionais em cada uma das posições.
O que não é aceito, por exemplo: 000-000-000-00 (mas pode ser alterado conforme nota abaixo)
Regex:
([0-9]{2}[\.]?[0-9]{3}[\.]?[0-9]{3}[\/]?[0-9]{4}[-]?[0-9]{2})|([0-9]{3}[\.]?[0-9]{3}[\.]?[0-9]{3}[-]?[0-9]{2})
Clique aqui e faça seus testes em realtime no regexpal.
Explicação:
[0-9]{2}
Faixa de caracteres: 0 a 9, quantidade: 2 caracteres;
[0-9]{3}
Faixa de caracteres: 0 a 9, quantidade: 3 caracteres;
[0-9]{4}
Faixa de caracteres: 0 a 9, quantidade: 4 caracteres;
[\.]?
Um ponto, opcional. Foi usado \ no ponto, pois ele sozinho é caractere especial;
[-]?
Um traço, opcional (se acrescentar outros caracteres, comece pelo - sempre);
[\/]?
Uma barra, opcional. Também "escapada" com\
pra agradar o PCRE;
(grupo1)|(grupo2)
Se um dos grupos validar, a expressão é válida.
Caso queira aceitar outros separadores, basta acrescentar entre os
[ ]
.
Exemplo:[-\.\/]?
vai aceitar tanto-
quanto.
e/
naquela posição (?
= ou nada).
Para adaptar para outros "dialetos" de regexp, algumas variações possíveis seriam tirar o escape da barra (\/
=> /
) e opcionalmente colocar um ^
no começo e um $
no fim da linha.
Fonte: https://pt.stackoverflow.com/questions/11045/expressão-regular-para-validar-um-campo-que-aceita-cpf-ou-cnpj