Falando sobre Expressões Regulares: Quantos deseja? Nenhum? Um? Ou mais?
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”:
Primeiro, vamos fazer a regex capturar o protocolo 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:
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?
:
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…
O raciocínio é o seguinte, eu preciso capturar URLs seguindo algumas regras:
- começa com “http”;
- seguido por um ”s” opcional;
- seguido por ”://www.”;
- seguido por qualquer coisa;
- 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:
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:
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:
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 | ||
---|---|---|
Metacaractere | Nome | Função |
. | ponto | captura qualquer caractere |
[ ] | colchetes ou lista | captura qualquer um dos caracteres listados |
\ | barra invertida | torna literal o metacaractere à sua direita |
Modificadores que determinam quantidade: Quantificadores | ||
Metacaractere | Nome | Função |
? | interrogação | torna o elemento à sua esquerda opcional |
* | asterisco | torna o elemento à sua esquerda opcional e permite múltiplas ocorrências |
+ | mais | elemento à sua esquerda deve aparecer uma ou mais vezes |
Valeu pessoas! Bom café a todos!
Falou…