Regex sem medo: de uma vez por todas (parte 2)

Prosseguindo com o post anterior, vamos falar sobre o operador “ou”, grupos e substituição. A propósito: eu tinha pego um texto do tipo Lorem Ipsum para utilizar de alvo nos exemplos anteriores, mas confesso que ficou bem bosta. Portanto, a partir de agora, vou utilizar um texto que se adapte melhor ao contexto do problema.

Operador “|”: um ou outro

Imagine uma lista de URLs entre as quais você queira encontrar as que utilizam http e https. Você poderia simplesmente utilizar a seguinte regex:

/https?:\/\/.+/

Screenshot from 2017-08-04 21-24-54

Que diz ao interpretador:

um “http”, seguido ou não de um “s”, seguido de uma “/”, seguido de outra “/”, de um ou mais qualquer coisa.

Neste caso, as barras estão escapadas (cada uma com uma contra barra) para evitar que que elas sejam interpretadas como o final da regex, já que elas são representadas sempre entre duas barras.

Agora imagine que você precisa casar também as URLs que utilizam o protocolo FTP. Utilizando os coringas e as listas de opções que foram apresentadas até agora, isso não seria possível (pelo menos não de um jeito fácil). É para isso que serve o operador “|” (ou); separar duas ou mais opções de busca. A regex ficaria assim:

(http|https|ftp):\/\/.+

Screenshot from 2017-08-04 21-51-22

Que diria:

um “http”, ou um “https”, ou um “ftp” seguido de uma “/”, seguido de outra “/”, de um ou mais qualquer coisa.

Repare que além do operador “|” foram inseridos os caracteres de agrupamento “(” e “)” para delimitar o grupo de opções.

Sem os parênteses:

/http|https|ftp:\/\/.+/

O resultado seria:

Screenshot from 2017-08-04 22-21-19
Porque o interpretador entenderia que você procura cada um dos blocos isoladamente, como se fosse 3 regexes:

/http//https/ ou /ftp:\/\/.+/

Outra alternativa seria você definir as 3 regexes separadas por “|”:

/http:\/\/.+|https:\/\/.+|ftp:\/\/.+/

Screenshot from 2017-08-04 22-35-35

(…) que, na minha opinião, não fica nem bonito nem muito inteligente. Mas funciona! 

Outra vantagem do agrupamento (ou grupo) é que ele cria referências para cada match chamadas de retrovisores (ou back reference) que podem ser utilizadas na em casos de substituição. Funciona assim: cada item de grupo casado é armazenado em uma variável para ser utilizada em uma operação de substituição. Por exemplo, o primeiro match do grupo fica em \1, o segundo em \2 e o eNésimo no \N. Exemplos explicam mais: vamos mascarar alguns CEPs utilizando a ferramenta de substituição do regex101.com bem na parte inferior da tela:

Screenshot from 2017-08-04 22-56-03

É só clicar sobre o SUBSTITUTION que ele a tela expande com o preview das substituições.

Substituindo

O CEP é algo mais ou menos assim XX.YYY-ZZZ, em que Z, Y e Z são inteiros entre 0 e 9. Portanto a regex fica:

/([0-9]{2})([0-9]{3})([0-9]{3})/

Ou seja:

Dois caracteres entre 0 e 9 (primeiro grupo: \1), seguidos de mais três caracteres entre 0 e 9 (segundo grupo: \2), seguido por mais três caracteres entre 0 e 9 (terceiro grupo: \3).

Vale acrescentar aqui cada um dos “0-9” da regex anterior poderia ser substituído por um “\d” – de dígito – que funciona exatamente da mesma forma. Falaremos sobre esses meta caracteres em outra ocasião, mas tenta lá.

E vou separar cada um dos grupos com o caractere adequado da máscara:  ou um “.” ou um “-“:

\1.\2-\3

Que é interpretado:

Primeiro match seguido por um ponto, seguido pelo segundo match seguido por um hífen, seguido pelo terceiro match. 

E o resultado:

Screenshot from 2017-08-04 23-09-42

Encerrando…

Ficou um pouco mais longo do que eu tinha imaginado inicialmente, portanto, vou encerrar por aqui. Continuamos na parte 3. Sugestões e críticas são mais bem-vindas que boletos e dívidas.

Obrigado por ler (ou “por ter lido”?) e até o próximo.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s