De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Julio Cezar Neves
Data de Publicação: 16 de julho de 2018
Uma vez eu estava escrevendo um programa no qual eu tinha de localizar todos os endereços de hardware (Mac Address) válidos de um arquivo todo bagunçado. Isso tem tanto tempo que nem me lembro para que era o programa, nem qual linguagem ele usava, mas me lembro que tinha 2 problemas:
Resultado: tive de escrever uma rotina imensa para conseguir o meu intento.
Um amigo meu quando viu aquilo disse:
No dia seguinte ele me levou a revista (era um PC Magazine que acho que não existe mais há anos) e vi que "regras de expressão" era Expressões Regulares e meu amigo tinha se enganado.
E eu melhorei muito a minha rotina fazendo algo assim (ou usar o ifconfig
nos exemplos para vocês poderem testar):
$ ifconfig | grep "\
[0-9A-Za-z][0-9A-Za-z]:\
[0-9A-Za-z][0-9A-Za-z]:\
[0-9A-Za-z][0-9A-Za-z]:\
[0-9A-Za-z][0-9A-Za-z]:\
[0-9A-Za-z][0-9A-Za-z]:\
[0-9A-Za-z][0-9A-Za-z]"
enx00e058 Link encap:Ethernet Endereço de HW 00:e0:5d:53:44:58
Cada uma das listas [0-9A-Za-z]
casa com um algarismo hexadecimal. Então eu coloquei em cada linha um par de algarismos com um dois pontos (:
).
Mas existem as classes POSIX e dentre ela a [:xdigit:]
que pode substituir/simplificar o conteúdo dessas listas, ficando assim:
$ ifconfig | grep -o "\
[[:xdigit:]][[:xdigit:]]:\
[[:xdigit:]][[:xdigit:]]:\
[[:xdigit:]][[:xdigit:]]:\
[[:xdigit:]][[:xdigit:]]:\
[[:xdigit:]][[:xdigit:]]:\
[[:xdigit:]][[:xdigit:]]"
Por outro lado, o grep
tem a opção -o
(match Only) que só exibe o que casou com a Expressão Regular, facilitando a visualização do resultado. A saída deste comando seria somente:
00:e0:5d:53:44:58
Passou um bom tempo e descobri que posso especificar a quantidade exata de caracteres que eu quero casar, colocando-a dentro de um par de chaves ({}
). Isso já diminuiria um pouco o tamanho da Expressão Regular, mas este quantificador já é considerado uma Expressão Regular avançada e requer o uso da opção -E
do grep
e -r
do sed
. Ficaria então assim:
$ ifconfig | grep -oE "\
[[:xdigit:]]{2}:\
[[:xdigit:]]{2}:\
[[:xdigit:]]{2}:\
[[:xdigit:]]{2}:\
[[:xdigit:]]{2}:\
[[:xdigit:]]{2}"
00:e0:5d:53:44:58
Ora, se eu posso especificar quantidades, então eu posso dizer que esse grupinho de 2 hexa e um dois pontos (:
) pode ocorrer 5 vezes e depois ter mais um sem os dois pontos.
Sim, dá para fazer isso, desde que você conheça o conceito de grupo. Um grupo é delimitado por um par de parâmetros e todos os quantificadores que você aplica no grupo, aplica em todos os seus elementos. Então esta Expressão Regular, ficaria em sua forma mais compacta da seguinte forma:
$ ifconfig | grep -oE "([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}"
00:e0:5d:53:44:58
Uma coisa interessante no grupo é que ele aumenta tremendamente o poder de uma Expressão Regular, mas se ele estiver sendo usado com o OU lógico (|
), ele restringe a Expressão Regular e é exatamente isso que lhe dá mais poder. Veja a Expressão Regular (fla)?meng(o|ão)
. O ponto de interrogação torna o grupo formado pelas letras fla
opcional, isto é, pode existir ou não. Já o grupo (o|ão)
restringe o escopo do OU (|
) só a essas letras. Se não fosse o grupo, teríamos de fazer mengo|mengão
. Resumindo: esta Expressão Regular casa com flamengo, mengo, mengão e de quebra, flamengão, mas não casa com "siga o líder" ;)
Pessoal, quem quiser melhorar suas habilidades com Expressões Regulares, faça as palavras cruzadas do site RegexCrossword. Garanto que você vai se divertir.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários