E aí pessoas!

No último post criamos uma regex pra bater com o domínio do blog. Eu gostei tanto do exemplo que resolvi continuar com ele. A ideia agora é expandir a regex para que passe a capturar diversas URLs.

Nosso ponto de partida é a regex que bate apenas com o domínio “www.devsv.com.br”:

imagem ilustrando matching da url do devsv

Primeiro, vamos fazer a regex capturar o protocolo http:

imagem ilustrando matching da url do devsv com http

Notem que é preciso escapar as barras após o “http:”, uma vez que elas fazem parte da sintaxe do RegExr (elas delimitam o início e o fim da expressão (análogo às aspas em volta das strings em muitas linguagens de programação), portanto uma barra só é considerada literal se for escapada; esta sintaxe não é exclusividade do JavaScript, outras linguagens como Ruby e ferramentas como sed e vi também delimitam uma regex com barras).

P.S.: Sem querer eu fiz um Inception de parênteses no parágrafo acima. Muito louco! Ahahaha!

Próximo objetivo: aceitar o protocolo https:

imagem ilustrando matching da url do devsv com https

Muito bom! Mas estamos em um processo incremental e queremos manter o match com “http://www.devsv.com.br”.

Vamos pensar um pouco… O que precisamos fazer pra bater as duas URLs?

Hmmm… O “http” está sempre lá… já o “s” pode estar presente ou não, tanto faz… o restante da regex está ok…

Bingo! Este é o ponto, tanto faz se o “s” aparece ou não na URL, a regex deve capturar os 2 casos. Resumindo, o “s” é um elemento opcional.

O metacaractere que vai nos ajudar nesta tarefa é o ? (interrogação). Sua função é fazer com que o caractere à sua esquerda se torne opcional. Se o objetivo é ter um “s” opcional, usamos a regex s?:

imagem ilustrando matching da url do devsv com http ou https

Bão demais!

Hora de aumentar o grau de dificuldade! Novo objetivo: capturar qualquer URL com domínio terminado em “.com.br”.

Vish! E agora?

Mais um momento de reflexão…

imagem pensando...

O raciocínio é o seguinte, eu preciso capturar URLs seguindo algumas regras:

  1. começa com “http”;
  2. seguido por um ”s” opcional;
  3. seguido por ”://www.”;
  4. seguido por qualquer coisa;
  5. terminando com “.com.br”.

As regras 1, 2, 3 e 5 já são satisfeitas na nossa regex. A pendência que temos pra resolver, é a regra 4: aceitar qualquer coisa.

Já conhecemos o ponto, que bate com qualquer caractere único. Mas o que precisamos é que qualquer caractere possa aparecer várias vezes. E várias vezes deve ser uma quantidade variável. Afinal, existem URLs com 3 letras, 5 letras, 8 letras, etc.

Bingo de novo! Essa é a ideia! Como já é previsível, é agora que eu mostro mais um metacaractere. Então que seja bem vindo o * (asterisco).

O asterisco (assim como o ponto de interrogação) é um metacaractere chamado de quantificador, pois ele não define o que a regex deve bater, mas define a quantidade de vezes que um elemento pode aparecer no matching. Falando especificamente do asterisco, seu papel na regex é permitir que o caractere imediatamente à sua esquerda apareça nenhuma, uma ou mais vezes no matching.

Voltando ao nosso problema, o vulgo “qualquer coisa” pode ser escrito como .*. Aplicando na regex, temos:

imagem ilustrando matching de urls .com.br

Parece bonito, mas tem um porém. O .* também aceita a ausência de “qualquer coisa”, portanto a URL “http://www..com.br” é capturada no matching, veja:

imagem ilustrando matching da url www..com.br

Existe um outro metacaractere, o + (mais), que faz com que a regex aceite uma ou mais repetições do elemento imediatamente anterior a ele. Muito parecido com o asterisco, a diferença é que ele não tolera a ausência do elemento.

Vejamos como ele se comporta em nossa regex:

imagem ilustrando matching correto de urls .com.br

Legal! Estamos conseguindo deixar nossa regex cada vez mais genérica. E vamos melhorá-la ainda mais. Mas agora é hora de uma pausa pro café.

Deixe-me apenas 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

Valeu pessoas! Bom café a todos!

Falou…


Eu quero um Ponto Literal e ponto final! (anterior) (próximo) Se conselho fosse bom…