Designing a regular expression to find phone numbers is some string are not trivial. The rules of what is a valid number are strange, and the phone itself can be present with any number of artifacts, like spaces, dashes and parentheses.
This last morning I have been trying to design a good regular expression but I’m still a bit far. So far I managed to do:
(\(?[\s]*(00|\+){1,1}[\d]{1,4}[\s]*\)?)?([\s]*|-)(-|[\s])?(\(?[\d]\)?([\s]*|\.|-)){7,15}
But it sill misses things like: +351 (21) 1111111
Tópicos (RSS)
«Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.»
Os números de telefone são um bom exemplo de um problema onde as expressões regulares não são a melhor solução.
É capaz de ser mais fácil de usar uma expressão regular para encontrar sequências de digitos que _podem_ ser números de telefone, e depois usar um algoritmo mais complicado (potencialmente com expressões regulares mais simples lá dentro) para verificar se realmente se trata de um número de telefone.
Eu resolvia isso da seguinte forma:
1 – Removia tudo da string excepto os números
2 – Escrevia uma expressão regular para aceitar 4 formatos distintos: +351XXX.., 00351XXX, 21XXXX
E pronto!
Pedro Pais: Esqueci de dizer que eu precisava de saber onde na string original se encontrava o número.
Carlos: Essa é uma boa alternativa. A questão aqui é que neste caso eu não estava a fazer de raiz, mas apenas a melhorar problemas em algo que já existia. Talvez vá re-fazer isto.