Minicurso ministrado durante a semana acadêmica de TSI (UTFPR/Guarapuava) que introduz as pessoas ao mundo das Expressões Regulares (REGEX).
Este minicurso foi produzido e apresentado por mim juntamente com Matheus Mazepa.
2. Danilo Pinotti
danilopinotti@hotmail.com
Desenvolvedor WEB, líder técnico e
infra na empresa Let’s Sistemas
(2017 - Atualmente).
Administrador de sistemas na
Faculdade Guarapuava (2017);
Tecnólogo em Sistemas para
Internet (UTFPR - Guarapuava,
2017);
Ex-estagiário na área de redes e de
administração de sistemas (UTFPR,
2015-2017);
4. Roteiro
● O que é REGEX
● Exemplos práticos de utilização
● Conceitos básicos e ferramentas
● Construção de uma REGEX
● Boas práticas
● Como utilizar
● Desafios
9. O que é RegEx ?
Expressão Regular é uma linguagem de busca de padrões. É uma linguagem onde
inserimos um padrão de texto (pattern), o texto alvo (target) e pedimos para a
Regex Engine fazer esta busca.
11. Exemplos de utilização
● Validações de formatos de textos (email, CPF, RG, etc.);
● Buscar palavras escritas duas vezes seguidas;
● Buscar por frases que não terminam com a pontuação adequada;
● Buscar linhas vazias ou com determinado tamanho;
● Separar dados que estão contidos em uma mesma linha (logs);
● Fazer substituições precisas;
13. Exemplo Real: O problema
Em 117 (CENTO E
DEZESSETE) linhas
diferentes!!!
14. Exemplo Real: A solução
Tempo de resolução do problema:
Escrever a Regex: ~ 1 minuto
Executar a Regex: < 50 ms
15. Mais exemplos de utilização
● Buscar por nomes de funções (camelCase, snake_case, kebab-case,
PascalCase);
● Buscar lugares em que o espaço está posicionado errado (antes/depois de
pontuações);
● Buscar por linhas que não terminam com ponto e vírgula;
● Comentar todas as linhas de um arquivo de uma vez só;
● etc.
16. Exemplo Real: O problema
- Estava tentando lembrar o nome de uma função que eu já
havia utilizado no projeto e só me recordava do início
dela: array_
- Na documentação da linguagem (PHP) existiam dezenas
de funções que começavam desta mesma maneira...
19. Conceitos básicos
Palavra match. A tradução literal desta palavra é
“corresponder’” porém, neste contexto, a palavra será
utilizada para dizer que uma expressão regular “casou” com
uma palavra, frase ou parágrafo, ou seja, quando uma
expressão regular conseguir representar o que foi planejada
para representar.
20. Conceitos básicos
Uma expressão regular é lida como uma palavra onde cada
parte dela (letra ou símbolo) representa, inicialmente, apenas
um caractere.
21. Conceitos básicos
Expressões Regulares, também conhecidas como RegEx são compostas por
caracteres literais e metacaracteres.
São chamados metacaracteres os caracteres que servem para representar,
quantificar, agrupar ou posicionar outros caracteres. São eles:
. ? * + ^ $ | [ ] { } ( )
Para transformar um metacaractere em um caractere literal, utiliza-se o escape ().
Por exemplo: ? . +
24. Metacaracteres: Lista [ … ]
A lista é um dos componentes mais utilizados. Ela permite você escolher quais
caracteres poderão aparecer no lugar em que ela foi colocada.
25. Metacaracteres: Lista [ … ]
Uma lista representa apenas um caractere.
Dentro da lista todos os caracteres são literais, com exceção do traço (-), do
acento circunflexo (^) e, caso não seja o primeiro ítem da lista, o colchete de
fechar (]).
É possível utilizar um intervalo de dados dentro da listas, desta forma,
facilitando filtrar caracteres. Os intervalos mais comuns são:
a-z A-Z 0-9
Para construir mais intervalos, consultar tabela ASCII.
26. Metacaracteres: Lista negada [ ^ … ]
Uma lista negada funciona de forma semelhante à lista comum. A diferença é que
ela casa com qualquer caractere, exceto com os que estão dentro dela.
27. Metacaracteres: Ponto .
O ponto ( . ) é um metacaractere curinga que se casa com absolutamente
qualquer caractere.
28. Metacaracteres quantificadores: Chaves { }
O metacaractere chave é utilizado para limitar quantas vezes um elemento da
REGEX poderá se se repetir. Você pode escolher:
Exatamente uma quantidade: #[A-F0-9]{6} (cor em Hexa Decimal, P.E)
Quantidade mínima de ocorrências: .{8,} (senha de no mínimo 8 dígitos, P.E)
Entre uma quantidade e outra de ocorrências: [a-zA-Z0-9_]{3, 15} (nome de
variável, P.E)
31. Metacaracteres quantificadores: * e +
Ambos servem para não limitar a quantidade de vezes de ocorrências de um
elemento da REGEX.
O que muda é que enquanto o ‘*’ pode casar nenhum ou muitos, o ‘+’ casa com um
ou mais.
32. Metacaracteres quantificadores: * e +
Estes metacaracteres são gulosos. Eles sempre vão tentar casar o máximo
possível. Para evitar este comportamento, coloque a interrogação ao lado direito
deles.
33. Metacaracteres âncoras: ^ e $
Metacaracteres chamados de âncoras são aqueles que permitem você “posicionar”
sua expressão regular.
O circunflexo (^) indica o início de uma linha enquanto o cifrão ($) indica o final.
34. Metacaracteres âncoras: b
Este metacaractere representa uma borda de palavra indicando o início ou o fim
dela. A borda não necessariamente será um espaço.
35. Metacaracteres tipo barra-letra
Esses metacaracteres são formados por uma "" seguida de uma letra, cada letra
altera o significado desse metacaractere.
As letras maiúsculas geralmente são a negação dos seus valores minúsculos
36. Metacaracteres tipo barra-letra: w e W
O metacaractere w casa com valores
alfanuméricos (A-Za-z0-9).
Já o metacaractere W casa com valores
que não sejam alfanuméricos.
37. Metacaracteres tipo barra-letra: d e D
O metacaractere d casa com valores
numéricos.
Já o metacaractere D casa com valores
diferente de números.
39. Metacaracteres: Grupos ( )
Grupos são poderosos. Com grupos você pode:
- Agrupar elementos de uma RegEx (não me diga);
- Repetir séries de elementos;
- Capturar trechos específicos.
40. Metacaracteres: Grupos ( )
Antes, com listas, você poderia quantificar apenas um elemento, agora com
grupos, você pode quantificar trechos inteiros de uma RegEx:
41. Metacaracteres: Grupos ( )
Para cada grupo, é criado uma referência à ele na memória, podendo ser
acessados em código. A forma de fazer este acesso varia de acordo com o
interpretador/compilador utilizado.
42. Metacaracteres: Retrovisores n
Os retrovisores servem para buscar por palavras ou trechos de RegEx repetidos e
só funcionam junto com grupos.
Temos no máximo 9 retrovisores por RegEx.
([A-Za-z]+)-?1 -> Casa com bombom, lili, bibi, e outros apelidos e nomes de
cachorro
(quero)-?1 -> Casa com quero-quero
in(do)lo(r) é sem 12 -> Casa com ?
43. Metacaracteres: Ou ( | )
O metacaractere Ou ( | ) é utilizado quando precisamos casar mais de um termo
em um mesmo local de uma regex. Pode ser utilizado junto ou não com grupos.
47. Evitar lista negada
Tentar utilizar possibilidades
válidas em listas comuns;
Não ter preguiça de descobrir todas
as possibilidades de uma posição;
48. Seja específico
Tentar evitar a utilização do curinga
(ponto);
O que você quer casar? Em que
quantidade ? Em qual contexto ou
posição ?
Redução nas chances de falhas.
49. Como elaborar uma
boa RegEx
1. Mentalizar um objetivo (Casar
emails, telefones, etc.);
2. Fazer um modelo genérico
cheio de curingas;
3. Torná-la mais específica
testando cada modificação;
4. Ao terminar, buscar por
exceções e alternativas.
55. Desafios
1. Comentar todas as linhas de um arquivo
2. Verificar se um e-mail é válido.
3. Verificar se um CNPJ está no formato correto: xx.xxx.xxx/xxxx-x
4. Verificar se um dado horário é válido (formato 24h)
5. Buscar por palavras escritas duas vezes seguidas
6. Buscar lugares em que o espaço está errado: antes/depois de
pontuações
7. Nomes de funções (buscar camelCase, snake_case, kebab-case,
PascalCase)
59. Referências
JARGAS, A. M. Expressões Regulares uma Abordagem Divertida. 4 ed. NOVATEC, 2016
MELO – Raul Felipe – Entendendo de uma vez por todas Expressões Regulares –
2017 – em:
https://medium.com/trainingcenter/entendendo-de-uma-vez-por-todas-express%
C3%B5es-regulares-parte-1-introdu%C3%A7%C3%A3o-dfe63e289dc3