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.


Expressões Regulares - Localização de endereços de hardware (mac address)

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:

  1. Nunca tinha sequer ouvido falar em Expressões Regulares;
  2. Á época não existiam nem resquícios de internet para procurar dicas.

Resultado: tive de escrever uma rotina imensa para conseguir o meu intento.

Um amigo meu quando viu aquilo disse:

  • Há pouco tempo li uma revista que mostrava um caso parecido com esse e o cara resolvia usando "regras de expressão".
  • "Regras de expressão"??? Que p?®®* é essa?

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.

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Julio Cezar Neves