E aí pessoas!

Ao longo dos últimos posts, estamos nos familiarizando com as expressões regulares enquanto criamos uma expressão que captura URLs. E a proposta pra hoje é seguir de onde paramos.

Nossa regex está aceitando qualquer domínio escrito com letras de “a” a “z”, desde que terminem em “.com.br”:

imagem ilustrando matching com urls .com.br

Hora de expandir os horizontes, aceitar outros tipos de domínios como “.org.br”, “.gov.br”, “.net.uk”, etc.

Temos que começar identificando a regra. Como comentei no post anterior, eu não conheço o padrão oficial pra definição do nome de domínio. Então, vamos fechar que no nosso cenário a regra é: “3 letras seguidas de um ponto seguido de mais 2 letras”. Ok?

Uma solução rápida é incluir diversas listas de “a” a “z” em nossa expressão. Vamos tentar?

imagem ilustrando matching de urls sem restringir em .com.br

O resultado já é satisfatório, mas a expressão ainda pode melhorar no quesito legibilidade. Até que ainda não está tão ruim, mas imagine se a regra mudasse para “30 letras seguidas de um ponto seguido de 20 letras”. A expressão ficaria bizarramente enorme.

Este cenário hipotético levanta uma questão: Será que não existe um quantificador que defina a quantidade exata de vezes que o elemento deve aparecer no matching?

Não é que existe mesmo? Quem faz este serviço são as chaves. Com elas especificamos a quantidade usando a sintaxe c{n}, onde n é o número de vezes que o elemento c deve se repetir.

Vejamos como fica nossa regex reescrita para usar as chaves:

imagem ilustrando matching de urls sem restringir em .com.br usando chaves

Show!

Temos regras bem definidas e uma regex que nos atende muito bem. Mas um requisito não é um requisito se não sofrer nenhuma alteração durante o desenrolar do projeto!

O novo requisito diz que precisamos capturar também URLs que seguem o mesmo padrão da Universidade de Tóquio: “http://www.u-tokyo.ac.jp”.

Ela tem 2 características que impedem o match, um hífen no meio do nome do domínio e o penúltimo bloco com apenas 2 caracteres.

Pra passar a capturá-la, precisamos mudar a regra do nome principal do domínio para aceitar letras de “a” a “z” mais o hífen, além de mudar a regra do penúltimo bloco para aceitar tanto 2 quanto 3 letras.

A primeira alteração consiste em colocar o hífen no início ou no fim da lista, para que ele seja interpretado como um caractere literal.

Para realizar a segunda alteração, devemos passar 2 parâmetros para as chaves. Seguindo a sintaxe c{n,m}, dizemos pra regex aceitar entre n e m repetições do elemento c. Em nosso cenário, queremos que o bloco tenha de 2 a 3 letras, então passamos a expressão [a-z]{2,3}.

Aplicando as duas alterações temos:

imagem ilustrando regra que inclui url da utokyo no matching

Show! Maneiro!

Já que é pra mudar requisito, deixe-me inventar uma regra nova: o bloco principal do nome do domínio deve conter pelo menos 3 letras. Se existir algum domínio com apenas 1 ou 2 letras, só lamento!

Mais uma vez recorremos as chaves. Desta vez com a sintaxe c{n,}, que quer dizer que o elemento c deve se repetir n ou mais vezes. Bem parecido com o asterisco ou com o sinal de mais, com a diferença que nós definimos o limite inferior.

1… 2… 3… testando…

imagem ilustrando matching de domínios com pelo menos 3 letras

Show! Maneiro! Maneiríssimo!

Assim, conhecemos as três faces das chaves. No próximo post conheceremos um pouco da personalidade dos quantificadores.

Antes de encerrar, não custa atualizar a tabela dos metacaracteres:

Itens que batem com um caractere
MetacaractereNomeFunção
.pontocaptura qualquer caractere
[ ]colchetes ou listacaptura qualquer um dos caracteres listados
\barra invertidatorna literal o metacaractere à sua direita
Modificadores que determinam quantidade: Quantificadores
MetacaractereNomeFunção
?interrogaçãotorna o elemento à sua esquerda opcional
*asteriscotorna o elemento à sua esquerda opcional e permite múltiplas ocorrências
+maiselemento à sua esquerda deve aparecer uma ou mais vezes
{n,m}chaveselemento à sua esquerda deve aparecer no mínimo n e no máximo m vezes

Valeu pessoas!

Falou…


Se conselho fosse bom… (anterior) (próximo) Ela é gulosa… Estúpida!