Utilitário de Expressões Regulares
Thursday, April 12th, 2007Tenho uma função em PL/pgSQL que identifica a operadora pelo número e DDD denominada ‘operadora’
CREATE OR REPLACE FUNCTION operadora(text) RETURNS text AS ' declare ops text[]:= array['VIVO','CLARO', 'TIM','OI','Amazônia','Telemig','BRT','CTBC','Sercomtel','Nextel']; regexps text[]=array[ '((2[1-9]95|1[1-9](95|7[1-4]))|[49][1-9]9[1-4]|([25-7][1-9]9[6-9]|1[1-9]9[6-8]))[0-9]{6}$', '([12568][1-9]9[1-4]|4[1-9]88|[37][1-9]8[124]|6195|1[1-9](76|89))[0-9]{6}$', '(((([48][1-9]9[6-9])|([37][1-9]9[1-4])|(1[1-9]8[1-5]|[56][1-9]81)|([29][1-9]8[1-3])|(4381[0-9])|(1[1-9]86))[0-9]{6})|5[1-5]99(11|13|39|8[1-9])[0-9]{4})$', '[237-9][1-9]8[6-8][0-9]{6}$', '9[1-9]9[6-9][0-9]{6}$', '3[1-8]9[6-9][0-9]{6}$', '[4-6][1-9]84[0-9]{6}$', '((3[1-8](96[0-9]{6}|99[67][0-9]{5}|999[1-9][0-9]{4}))|(1[1-9]99[0-9]{6}))$', '4[1-6]99(4[1-6]|9[1-8])[0-9]{4}$', '7[0-9]{7}$' ]; begin for i in 1..10 loop if $1 ~ regexps[i] then --se match retorna a posiç return ops[i]; end if; end loop; return 'outros'; end ' LANGUAGE 'plpgsql' VOLATILE;
Isso funciona da seguinte forma, para cada operadora em ops temos uma expressão regular em regexps e um loop que faz match para todas as regexps.
Exemplo, a fração que analisa a operadora VIVO no centro oeste esta na regexps[0] em negrito(ou morenito, como estão dizendo isso por ai!)
….([25-7][1-9]9[6-9]|1[1-9]9[6-8]))[0-9]{6}$
As regras para determinar as operadoras são:
Trunking com a Nextel utiliza a série começada com 7. A Vivo em São Paulo está também utilizando a série 7 (71 a 74). A série 95 está sendo utilizada pela Vivo em São Paulo e Rio de Janeiro e pela Claro no Distrito Federal. (Marcado com * na tabela a seguir)
Operadora por área e Banda
| Estado (DDD) |
Banda A (96 a 99) |
Banda B (91 a 94) |
Banda D (8) |
Banda E (8) |
|
RJ, ES (21 a 28) |
Vivo
|
Claro
|
Oi 86 a 88 |
TIM 81 a 83 |
|
Amazônia (91 a 99) |
Amazônia Celular
|
Vivo
|
||
|
MG (31 a 38) |
Telemig Celular
|
TIM
|
Claro 84 |
|
|
BA, SE (71 a 79) |
Vivo
|
TIM
|
Claro 81 |
|
|
Nordeste (81 a 89) |
TIM
|
Claro
|
||
|
PR, SC (41 a 49) |
TIM
|
Vivo
|
Claro 88 |
Brasil Telecom 84 |
|
RS (51 a 55) |
Vivo
|
Claro
|
TIM 81 |
|
|
Centro Oeste (61 a 69) |
||||
|
SP (11 a 19) |
Vivo*
|
Claro*
|
TIM 81-85 |
- |
Casos Especiais de Operadoras (sempre tem
|
Operadora |
Cidades
|
|
CTBC Celular
|
Minas Gerais (96, 9960-9979 e 9991-9999) São Paulo(99) |
|
Sercomtel Cel.
|
Londrina e Tamarana, PR (9941-9946 e 9991-9998) |
|
TIM
|
Pelotas e região RGS. (9911, 9913, 9939, 9981-9989) Londrina e Tamarana, PR, área 43 (81) São Paulo (86) |
|
Claro
|
São Paulo (76 e 89) |
|
Vivo
|
São Paulo (71, 72, 73 e 74) |
Para facilitar o desenvolvimento das expressões, reduzi cada regra de cada localidade de cada operadora em ‘mini-expressões’, assim:
2[1-9]95 1[1-9](95|7[1-4]) [49][1-9]9[1-4] [25-7][1-9]9[6-9] 1[1-9]9[6-8] ....
Depois juntei tudo colocando um ou entre cada mini-expressão.
Funcionar funciona… mas como sempre teremos novas exceções. Um dos casos seria a utilização de Trunking ou banda de outra operadora ou uma norma da Anatel. Portanto se uma operadora faz parceria/pacto/etc com outra operadora teremos que alterar a expressão relativa a operadora, uma tarefa não muito agradável como essa da expressão da TIM.
(((([48][1-9]9[6-9])|([37][1-9]9[1-4])|(1[1-9]8[1-5]|[56][1-9]81)|([29][1-9]8[1-3])|(4381[0-9])|(1[1-9]86))[0-9]{6})|5[1-5]99(11|13|39|8[1-9])[0-9]{4})$
Dividir novamente e depois juntar tudo … em uma masturbação codificante!? … era isso que eu fazia :|.
Como sofremos por falta de informações ou preguiça de pesquisar!
Pesquisando(com preguiça de quebrar a expressão) encontrei o kregexpeditor, que eu ignorava por começar com K de KDE, que ao longo do tempo-linux esta acabando com o meu preconceito KDE/Qt.
Dei um apt-get e instalei o cara.
Puts! Tenho agora um editor gráfico de expressoes regulares!
Posso trocar isso
(((([48][1-9]9[6-9])|([37][1-9]9[1-4])|(1[1-9]8[1-5]|[56][1-9]81)|([29][1-9]8[1-3])|(4381[0-9])|(1[1-9]86))[0-9]{6})|5[1-5]99(11|13|39|8[1-9])[0-9]{4})$
por algo mais amigável como
Com o kregexpeditor vc pode abrir um arquivo texto pra fazer o match , criar e alterar expressões regulares em texto ou no modo gráfico.
Gostei muito do editor, tenho que rever meus conceitos sobre K*
