Pit Regex
Pit Regex
Desenvolvimento de Sistemas I.
Material Teórico
Material Complementar
DESAFIO
Situação-Problema 1
Situação-Problema 2
Situação-Problema 3
Problema em Foco
ATIVIDADE
Atividade de Entrega
R EFER ÊN CIAS
Referências
1/8
Material Teórico
Olá, estudante!
Vamos iniciar a disciplina abordando os conceitos necessários para que você possa realizar a
atividade através das situações-problema mais à frente.
Introdução
Esta Disciplina tem como objetivo apresentar temas atuais que favoreçam o seu aprendizado e os
relacione às Disciplinas cursadas por você até o momento. Nesse sentido, trabalharemos com a
temática das Expressões Regulares (ER), também conhecidas como Regular Expressions (RegEx). Elas
permitem que padrões de caracteres sejam buscados, validados e substituídos, quando necessário.
Segundo Jargas (2012, p. 19) uma expressão regular é um método formal de se especificar um
padrão de texto. Fitzgerald (2012) acrescenta a ideia de que essas strings (texto) são especialmente
codificadas e utilizadas como padrões para combinar com outros conjuntos de strings. Na
programação, string é um conjunto de caracteres cujo valor é texto. Dessa forma, grande parte das
linguagens de programação, interfaces de desenvolvimento (IDE) e editores de texto têm esse
recurso.
Trabalhar com expressões regulares exige bastante treino, pois haverá momentos que um simples:
\d (abreviação que corresponde a qualquer dígito de 0 a 9) poderá resolver um problema, enquanto
em outros, uma expressão mais complexa como ‘^\([1-9]{2}\) (?:[8|9][0-9]{4})-[0-9]{4}$’, será
necessária. Essa expressão corresponde ao número de telefone móvel brasileiro com 11 dígitos,
incluindo os parênteses para a identificação da cidade, espaço e um hífen entre os números. Veja o
exemplo: (99) 99999-9999.
Para tentar deixar as coisas mais claras, vamos pensar em algo simples utilizando ER: imagine um
hipotético viajante que está concluindo suas férias na cidade de Dublin. Ele está no centro da cidade
e precisa chegar ao aeroporto. Sua busca por horários trouxe uma lista com paradas e horários do
ônibus 782. Agora basta procurar embarques entre 4h30 e 4h35.
Obviamente que, nesse exemplo, você poderá simplesmente procurar o horário, sem necessidade
de recursos computacionais. Mas as coisas nem sempre são simples.
Veja a Figura a seguir, que apresenta a timetable do 782, com paradas e horários divididos por dias da
semana. Embora exija um pouco de esforço, ainda é possível localizar os horários desejados sem
grandes dificuldades. Mas, e se precisássemos realizar essa busca utilizando o computador? Ou
então, imagine que você, Analista de Sistemas do time, recebeu do Setor de Planejamento a missão
de ajudar o time front-end a realizar a mudança desses horários no website da Empresa. A tarefa
certamente não seria trivial, concorda? Como as expressões regulares poderiam ser úteis nesse
caso?
Figura 1 – Busca de texto utilizando Expressões Regulares
Fonte: Reprodução
Inicialmente, é preciso esclarecer que não há necessidade de conhecer Programação para aplicar
uma REGEX. Basta que a ferramenta com a qual estamos trabalhando permita sua utilização. Com
alusão ao cenário do viajante, basta procurar os embarques realizados entre 4h30 e 4h35 e podemos
ajudá-lo usando o termo ‘^0[0-9]3[0-9]’.
Quanto à expressão apresentada, até o final da disciplina você terá aprendido o significado dela. Por
enquanto, observe, na Figura 2, que apenas os horários definidos foram destacados e isso pode ser
bastante útil em seu trabalho como analista.
Figura 2 – Busca de texto utilizando Expressões Regulares
Fonte: Reprodução
A composição de caracteres e símbolos forma uma sequência, que é interpretada como uma regra
e, caso o texto apresente tal equivalência, podemos dizer que deu "match". Quem define isso é o
compilador/interpretador, quando verificar a combinação entre o conjunto de caracteres e o padrão
pattern procurado. Note que esse padrão procurado pode variar entre datas, horários, endereços de
e-mail, números de documentos como CPF e RG, declaração de funções E dados entre <tags></
tags>, etc.
Site
Para realizar os testes com as expressões regulares, você poderá utilizar
diferentes ferramentas. Nesta Disciplina, recomendamos o uso de três
ferramentas, pela facilidade de instalação, utilização e disponibilidade de
licença gratuita. Elas, no entanto, não são exclusivas. Editores de textos
como o MS Word, o Libreoffice Writer e o Google Docs (on-line) têm o recurso.
Preste atenção apenas às peculiaridades de cada uma delas.
Notepad++
Clique no botão para conferir o conteúdo indicado.
ACESSE
Sublime Text
Clique no botão para conferir o conteúdo indicado.
ACESSE
ACESSE
Os exemplos demonstrados nesta Disciplina foram realizados a partir do VSCode. A ferramenta tem o
campo de pesquisa utilizando REGEX de forma nativa, mas é preciso habilitá-la. Existem duas formas
de realizar buscas desse modo: o primeiro é clicando no painel lateral esquerdo Search e, em
seguida, Use Regular Expression.
A Figura a seguir representa o processo:
Esse mesmo recurso pode ser acessado por meio do menu Edit/Find in files.
Ainda no menu Edit, a segunda forma de criar seus padrões deve ser realizada com um documento
aberto. Você poderá navegar até o menu Edit/Find ou simplesmente pressionar CTRL + F.
Figura 4 – Busca no VSCode com o REGEX habilitado
Fonte: Reprodução
Metacaracteres
Formada pelo agrupamento entre símbolos chamados de metacaracteres e caracteres literais, uma
expressão pode ser considerada uma regra pois, diante das condições estabelecidas, retorna
somente os resultados positivos. Os metacaracteres têm funções especiais e não podem ser usados
como um caractere literal. Caso esse seja o objetivo, o metacaractere deve ser precedido por uma
barra invertida (\).
Também chamamos esse recurso de escape. ele retorna o valor literal do elemento à sua direita.
Veremos diversos metacaracteres, como ‘.’ ,‘*’, ‘^’, ‘$’, ‘[’, ‘]’ etc. Todos eles têm alguma função especial
dentro das expressões regulares e quando não estivermos nos referindo a essas expressões,
podemos simplesmente utilizar o escape antes deles. Por exemplo: ‘\.’ ,‘\*’, ‘\^’, ‘\$’, ‘\[’, ‘\]’, etc.
Além do ponto final, que representa todos os caracteres, há opções de representar um ou mais
caracteres por meio dos colchetes ([]). De forma específica os colchetes são usados para criar classes
de caracteres, podemos ter uma lista ‘[...]’ e lista negada ‘[^...]’.
Junto com o ponto final, as listas formam uma categoria de representantes. Há, ainda, o grupo de
quantificadores, âncoras e alguns outros, mas, por hora, vamos falar um pouco mais sobre as listas.
Considere a Figura 2 apresentada mais cedo, caso fosse necessária uma reorganização dos horários
com os seguintes critérios:
Partidas realizadas entre hora cheia (00) e 29 min. devem mudar para 15 min.;
Assim, caso a partida seja às 04:22, o novo horário será 04:15, em outra situação com partida às 08:55,
o horário deve ser ajustado para 08:45. Note que o problema apresenta um desafio interessante e,
avaliando o cenário apresentado, minutos preciosos certamente seriam gastos nesta tarefa. Como
podemos utilizar a REGEX neste caso?
Inicialmente, adicionamos os ‘:’ (dois pontos) para definir horas e minutos, acreditamos que isso
facilite o entendimento. Na sequência, precisaremos buscar minutos e suas variações entre 0 e 2
para o primeiro algarismo, com a expressão ‘[0-2]’. Note que o ‘-’ (hífen) representando o intervalo
entre os valores foi colocado. A ausência desse operador definiria a busca exclusiva dos termos: 0 ou
2.
Um breve exemplo a partir desse segundo argumento seria a busca textual da palavra ‘não’ escrita
sem o acento. A instrução ‘n[aã]o’ traria ambos os resultados, com ou sem acento. Note que uma
REGEX pode ser construída com diferentes intervalos numéricos e textuais. Para saber o que cada
intervalo contempla é preciso estar atento(a) à Tabela ASCII, pois ela fornece as diretrizes sobre o
conjunto de caracteres presentes em uma sequência.
Por fim, precisaremos do complemento que pode ser qualquer dígito entre 0 e 9. Pensando na
descrição anterior, teríamos duas possibilidades, ‘[0123456789]’ ou ‘[0-9]’, sendo o segundo menor,
mais intuitivo e mais interessante para essa situação. Assim, temos ‘:[0-2][0-9]’. Essa, no entanto, não é
a única forma de realizar uma busca por dígitos decimais. O comando ‘\d’ é relativo a qualquer dígito
decimal entre 0 e 9. Com isso, poderíamos usar ‘:[0-2][\d]’ para obter o mesmo resultado.
A partir do padrão formado, podemos facilmente buscar o resultado inverso, ou seja, partidas com
horários entre 30 e 59 min. Uma forma de fazer isso seria modificar a expressão anterior com uma
lógica inversa, ou seja, negar o termo anterior pode trazer os valores procurados. A nova expressão
ficaria ‘:[^0-2][\d]’.
Figura 7 – Microsoft Visual Studio
Fonte: Reprodução
Como dito, as expressões regulares consideram a Tabela ASCII e, portanto, consideram as diferenças
entre localidades. Isso resulta em grandes diferenças realizadas em buscas nos documentos escritos
na Língua Portuguesa e Inglesa. O alfabeto norte-americano não tem caracteres acentuados como
‘áéóõç’, ‘áéíóú’ ou ‘ÁÉÍÓÚ’. Logo, a instrução ‘[a-z]’ não retornaria os caracteres minúsculos.
Para a nossa sorte, alguns artifícios foram criados para auxiliar o trabalho com listas. Sobretudo,
quando pensamos na localidade do sistema, as classes denominadas POSIX operam como um
padrão para determinar interfaces comuns entre sistemas operacionais. Embora sejam declaradas
entre dois pontos e colchetes, é importante lembrar que esses colchetes não se referem às listas.
Vejamos algumas:
Embora existam outras classes, nesta Disciplina, iremos nos concentrar nas que foram apresentadas
até agora. Você perceberá que elas são suficientes para cobrir grande parte das combinações e para
iniciar suas REGEX de forma muito ampla. Além disso, esse é um convite para que você acesse os
Materiais Complementares e aprofunde o conhecimento no assunto.
Para buscar as repetições também podemos utilizar o asterisco ‘*’, que retorna o resultado positivo
com zero ou mais ocorrências e o sinal de positivo ‘+’, que dá match quando localiza uma ou mais
ocorrências. Considerando uma página web com código HTML e suas tags de abertura e
fechamento, a instrução ‘</+html’ daria match apenas com a tag de fechamento. Isso, porque exige
que um ou mais atributos ‘/’ sejam contemplados, enquanto ‘</*html’, em que não existe a
ocorrência da entidade, retorna positivo para ambas as tags.
Para concluir os metacaracteres quantificadores, temos as chaves ‘{}’. Com elas, podemos especificar
exatamente quantas repetições do elemento anterior estamos procurando. É possível buscar o
número exato de ocorrências utilizando ‘{valor}’, ou intervalos com ‘{min,max}’ e ‘{min,}’. Faça o teste:
qual seria o match da REGEX ‘\d{4}’ para o número de telefone: (99) 99999-9999?
Metacaracteres Tipo Âncora
Os metacaracteres do tipo âncora marcam uma posição específica na linha. As âncoras comumente
usadas são o acento circunflexo ‘^’ e o cifrão ‘$’. Eles correspondem, respectivamente, ao início e ao
final de uma linha.
[.;]$ - localiza linhas que encerram com um ponto final ou ponto e vírgula.
Observe que os metacaracteres ‘^’ e ‘$’ operam nas linhas. Caso seja necessário buscar termos
específicos, precisaremos utilizar a borda ‘\b’. Com ela, poderemos buscar palavras específicas por
seu prefixo ou sufixo.
Vejamos:
Quadro 1
Expressão Match
Cabe lembrar, ainda, que o acento circunflexo também pode ser utilizado dentro das listas. Nesse
caso, ele tem a característica de negação, ou seja, enquanto a expressão ‘^[0-9]’ buscaria linhas
iniciadas em números, ‘^[^0-9]’ faria exatamente o contrário.
Outros Metacaracteres
Quanto trabalhamos com listas, sabemos que a expressão ‘^[AO]’ representa uma busca que dará
match com algum dos artigos, A ou O, no início da linha. Essa comparação também poderá ser realiza
entre listas com o operador barra vertical ‘|’. Dessa forma, poderíamos buscar os artigos em seu
formato literal com a instrução ‘A|O’ ou, então, buscar termos entre diferentes listas. Considere a
Tabela de Horários apresentada anteriormente. Caso fosse necessário buscar partidas às 7h30 ou às
9h30, a expressão ‘[\d]7|[\d]9:30’ resolveria o problema.
Esse último exemplo dá dimensão do poder dos metacaracteres utilizados em conjunto. Pode-se
trabalhar, ainda, em grupos de caracteres, utilizando os parênteses de abertura e fechamento‘()’.
Esses blocos ajudam a buscar termos específicos como, por exemplo: ‘a(b|c)d’, que pode dar
match com ‘abd’ ou ‘acd’, enquanto ‘ab|cd’ retornará ‘ab’ ou ‘cd’. Para ficar mais claro, pense na
instrução ‘(super l hiper) mercado’. Quais seriam os resultados?
Além de agrupar um conjunto de caracteres, os parênteses também podem ser úteis para
realizarmos substituições. Os grupos são naturalmente identificados em ordem numérica e, por isso,
na sequência ‘([0-9]{2})([0-9]{2})’ seria identificada como $1$2. Considerando a timetable do 782,
podemos facilmente adicionar os dois pontos substituindo a expressão por ‘$1:$2’.
Figura 8 – Tabela de horários após receber a adição de dois
pontos
Fonte: Reprodução
Ao longo desta Disciplina, vimos o símbolo ‘\d’, uma barra invertida acompanhada de uma letra que
representa um valor numérico. Com ele, podemos localizar valores entre 0 e 9 dentro de
expressões aumentando a abrangência desse recurso. Ele faz um conjunto de metacaracteres do
tipo barra-letra e aumenta substancialmente o poder das expressões regulares.
Cada letra representa um comando diferente. Por exemplo, se for necessária uma busca por
caracteres numéricos, já sabemos que o ‘\d’, que também pode ser representado como lista [0-9], é
uma opção. E se precisássemos rastrear os valores não numéricos, é simples, utilizamos o ‘\D’, ou
seja, existe diferença entre letras maiúsculas e minúsculas. Experimente buscar os espaços em
branco com ‘\s’ e preenchidos com o ‘\S’, ou, então, ‘\w’ que corresponde a qualquer caractere
alfanumérico e ‘\W’ que corresponde a qualquer caractere não alfanumérico.
Isso não significa que todas as letras do alfabeto tenham sido utilizadas. É preciso ter em mente que
cada Linguagem de Programação, sua interface de desenvolvimento (IDE) ou aplicação que permite
a utilização de REGEX tem sua própria notação. Além disso, podemos fazer equivalências entre os
metacaracteres barra-letra e as classes POSIX. A principal vantagem de utilizar o barra-letras é que
eles podem ser usados fora das listas.
\d [[:digit:]] Dígito
\D [^[:digit:]] Não-digíto
\W [^[:alnum:]_] Não-palavra
\s [[:space:]] Branco
\S [^[:space:]] Não-branco
Na ferramenta de planilha, as expressões regulares são úteis para resolver problemas com strings de
texto por meio da combinação de padrões e, por meio dela, podemos encontrar nomes ou números
de telefone entre uma grande quantidade de dados, validar endereços de e-mail, extrair URLs,
renomear nomes de arquivos etc.
Para trabalhar com REGEX no âmbito das planilhas, a Google disponibiliza três funções:
REGEXMATCH, REGEXEXTRACT e REGEXREPLACE. Com ela, podemos localizar e substituir strings de
texto, incluindo caracteres, números e palavras ou padrões por expressões regulares documentos,
planilhas e slides.
Considerando esse mesmo exemplo, você poderá extrair o ano de publicação dos livros. Para isso,
foi criada uma coluna chamada ano e utilizada a função REGEXEXTRACT. Observe que o
metacaractere dígito seguido do sinal de positivo retornou valores individuais para as células que
continham valor numérico e o erro #N/A para a única que não continha. Embora não seja o foco,
saiba que a Google Sheet fornece uma função para tratar esse tipo de erro ISNA() que, quando
combinada a outras funções, poderia dar um tratamento mais adequado ao problema. Experimente
usar a expressão ‘=IF(ISNA(REGEXEXTRACT(A4,"\d+")),FALSE)’.
Figura 11 – Lista com livros da série Vaga-Lume
Fonte: Reprodução
Já mencionamos, mas vale relembrar que existem muitas peculiaridades quando falamos de
expressões regulares. Na Google, a fórmula REGEXEXTRACT retorna um atributo de texto, e caso
aparecesse alguma continuidade envolvendo o valor numérico, algum tratamento, como no
exemplo do erro apresentado, seria necessário.
Além disso, se o texto apresentasse equivalência de dígitos numéricos em diferentes partes do texto,
somente a primeira ocorrência retornaria. Nesse caso, o título “O Mistério do 5 Estrelas (Marcos Rey,
1981)” retornaria o valor 5, o que certamente não satisfaz a nossa condição e, por isso, precisa
tratamento. Essa será uma ótima forma de praticar o que você aprendeu na Disciplina e, portanto,
deixaremos a resposta como uma das atividades propostas.
Ainda nesse cenário, algo bastante comum é a necessidade de substituição de caracteres. Por
exemplo, o número 5 de “O Mistério do 5 Estrelas (Marcos Rey, 1981)’ pode ser substituído por ‘cinco’
utilizando: ‘=REGEXREPLACE(A3,"\d\s", "cinco ")’.
Nesse caso, a própria REGEX foi suficiente para localizar e substituir o caractere em questão, mas
caso não seja possível fazê-lo em uma única instrução, lembre-se de que a combinação entre
funções e expressões regulares será sempre uma opção.
Nesta Disciplina, nem de longe tivemos a intenção de exaurir o assunto. Pelo contrário, esperamos
que você possa ter aprendido um pouco mais sobre as expressões regulares, entendida a
importância para resolver problemas computacionais e fomentando seu interesse sobre o tema.
Material Complementar
LEITURAS
Compilando Expressões Regulares
Tutorial introdutório sobre expressões regulares em Python.
https://bit.ly/3KZZhNl
Expressões Regulares
Uso de expressões regulares em JavaScript.
https://mzl.la/3SSSRSj
The POSIX Family of Standards
O Artigo apresenta características da Portable Operating System Interface (POSIX) e sua importância
para o desenvolvimento de sistemas.
https://bit.ly/3ZP1S0G
Situação-Problema 1
Caro(a), estudante.
Atente-se à situação profissional que você precisará entender para poder realizar a atividade.
Nessa primeira situação, a equipe se deparou com problemas na validação do e-mail, sem considerar
uma linguagem específica.
Situação-Problema 2
Atente-se à situação profissional que você precisará entender para poder realizar a atividade.
Quando o produto de software é disponibilizado para diferentes países, é comum que determinados
padrões sofram alterações, caso da data no formato norte-americano e brasileiro, por exemplo. Nos
Estados Unidos, a data é normalmente precedida pelo ano e tem como sequência o mês e o dia.
Nesse cenário, como as expressões regulares podem ajudar você a transformar as datas no formato
2022-11-30 para o padrão brasileiro?
5/8
Situação-Problema 3
Atente-se à situação profissional que você precisará entender para poder realizar a atividade.
Sabendo do seu talento como Analista de Sistemas, o Gestor de Projetos solicitou seu auxílio para
uma tarefa na Google Sheet. A exportação de dados trouxe alguns caracteres problemáticos e por
isso a validação da lista com aproximadamente 2000 endereços será necessária.
Agora que conhece as expressões regulares, como você poderia auxiliar o gestor utilizando a
ferramenta?
6/8
Problema em Foco
Validar o e-mail do usuário é algo necessário para toda aplicação que requer um cadastro e em
qualquer linguagem. Nesse sentido, as expressões regulares poderão ser bastante úteis e auxiliar o
time de desenvolvimento. A sugestão inicial para a primeira situação é que a validação utilize o “@”
como referência e que seja dividida em etapas, a primeira para localizar.
O segundo estudo de caso também é fato recorrente em diversos escritórios ao redor do Brasil.
Muitas vezes, um documento traduzido, uma planilha da qual fazemos download ou a extração de
dados de um sistema traz o padrão norte-americano de data. Isso não é um problema, pois, muitas
vezes, o objetivo é padronizar o que será armazenado na base. Entretanto, esse pode ser um
problema para o utilizador final.
As expressões regulares são bastante úteis e não se limitam a linguagens de programação. Diversas
aplicações permitem sua utilização e facilitam o processo de validação, extração e substituição de
dados, caso da Google Sheet.
7/8
Atividade de Entrega
Referências
JARGAS, A. M. Expressões regulares: uma abordagem divertida Aurélio Marinho Jargas. 4. ed. São
Paulo: Novatec, 2012.