Expressões Regulares - Entenda o que são Lookahead e Lookbehind

Neste artigo vou tentar explicar o conceito de lookahead e lookbehind positivo e negativo. Trata-se de recursos avançados em expressões regulares que em algum momento poderão vir a salvar o teu dia.

[ Hits: 9.676 ]

Por: Fábio Berbert de Paula em 19/11/2020 | Blog: https://fabio.automatizando.dev


Introdução



Posso comparar o momento em que você começa a se aprofundar e realmente entender expressões regulares como o momento em que um padawan Jedi aprende a manipular a força. A coisa é séria! Expressões regulares permitem você encurtar e muito o seu código, além de torná-lo bem mais legível e fácil de manter.

Lookahead e lookbehind são recursos onde você pode condicionar sua expressão com o que vem à frente ou antes da busca desejada, porém ele em si não será incluído no resultado da expressão.

Esse é um recurso avançado e ainda não está presente em todas as linguagens de programação. Por exemplo, JavaScript e Python sei que possuem suporte, já o sed ainda não.

Para um melhor entendimento, nada melhor que partirmos para a prática, certo?

Código em JavaScript. Tenho uma lista de nomes e, usando um positive lookahead, quero encontrar apenas pessoas com o sobrenome Fraga.

Lookahead Positivo

const nomes = `
Maria da Silva Mattos
Pedro dos Santos
Anderson Silva
Maria Joaquina Fraga
Vanderlei Silva
Silene Fraga Braga
Joana Dark da Silva
`
const regex = /^.*(?=\sFraga)/gm

console.log(nomes.match(regex))

Salve o código como regex.js e execute-o com o node, deno ou o interpretador JavaScript de sua preferência:

node regex.js

Também é possível executar o código acima no console da ferramenta de desenvolvedores do seu navegador padrão ou até mesmo acessar um interpretador online como o http://jsconsole.com/.

Como resultado teremos:

[ 'Maria Joaquina', 'Silene' ]

Vamos analisar a regex criada:

/^.*(?=\sFraga)/gm
  • / e / são os delimitadores da expressão regular;
  • ^ indica início da linha;
  • .* vai capturar qualquer caractere exceto quebra de linha (.) zero ou mais vezes (*);
  • (?=\sFraga) é o lookahead positivo. Essa expressão só trará resultados caso exista a palavra "Fraga" precedida de um espaço em branco (\s). Porém o lookahead não entra como resultado da expressão. Ela vai retornar tudo o que precede o lookahead;
  • gm são as flags global e multiline, uma vez que nossa variável possui múltiplas linhas.

Lookahead Negativo

É o inverso do lookahead positivo, irá dar match somente com os nomes que não satisfizerem a condição. Basta trocar "?=" por "?!".

const regex = /^.*(?!\sFraga)/gm

Lookbehind Positivo

const nomes = `
Maria da Silva Mattos
Pedro dos Santos
Anderson Silva
Maria Joaquina Fraga
Vanderlei Silva
Silene Fraga Braga
Joana Dark da Silva
`
const regex = /^.*(?<=da\s)Silva.*/gm

console.log(nomes.match(regex))

Salve o código como regex.js e execute-o com o node, deno ou o interpretador JavaScript de sua preferência:

node regex.js

Também é possível executar o código acima na ferramenta de desenvolvedores do seu navegador padrão ou até mesmo acessar um interpretador online como o http://jsconsole.com/.

Como resultado teremos:

[ 'Maria Joaquina', 'Silene' ]

Vamos analisar a regex criada:

/^.*(?<=da\s)Silva.*/gm
  • / e / são os delimitadores da expressão regular;
  • ^ indica início da linha;
  • .* vai capturar qualquer caractere exceto quebra de linha (.) zero ou mais vezes (*);
  • (?<=da) é o lookbehind positivo. Essa expressão só trará resultados caso exista a palavra "Silva" precedida de "da " (\s = espaço). Teremos como resposta todas as pessoas da família "da Silva", mas não as pessoas que são apenas "Silva";
  • gm são as flags global e multiline, uma vez que nossa variável possui múltiplas linhas;
  • como usei .* antes e depois do lookbehind, ele acabou sendo incluído no resultado da expressão.

Lookbehind Negativo

É o inverso do lookbehind positivo, irá dar match somente com os nomes que não satisfizerem a condição. Basta trocar "?<=" por "?<!".

Se executado no código acima, teremos como retorno:

[ 'Anderson Silva', 'Vanderlei Silva' ]

O conceito parece confuso, mas a prática leva a perfeição. Comece a tentar usar lookahead e lookbehind em suas expressões regulares!

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

Criando seu próprio servidor de DNS dinâmico (nsupdate + bind9)

O que são distribuições

Enviando mensagens de WhatsApp no Linux usando Shell Script e ADB

Como jogar poker no Full Tilt Poker pelo Linux

Como isolar seus projetos Python com virtualenv (ambiente virtual)

Leitura recomendada

W3C - World Wide Web Consortium

Diferenças de sites Web Standards

Como minimizar CSS e Javascript via linha de comando

Jakarta JMeter - Testando o desempenho de seus sites

Listar dados em MySQL utilizando PHP e AJAX (parte 1)

  
Comentários
[1] Comentário enviado por xerxeslins em 19/11/2020 - 09:56h


Muito bom.

Vou deixar aqui o link da página do "mestre Yoda" das expressões regulares, Aurélio Jargas:

https://aurelio.net/regex/

--
"There are lots of Linux users who don't care how the kernel works, but only want to use it. That is a tribute to how good Linux is." - Linus Torvalds

[2] Comentário enviado por fabio em 19/11/2020 - 22:44h


[1] Comentário enviado por xerxeslins em 19/11/2020 - 09:56h


Muito bom.

Vou deixar aqui o link da página do "mestre Yoda" das expressões regulares, Aurélio Jargas:

https://aurelio.net/regex/

--
"There are lots of Linux users who don't care how the kernel works, but only want to use it. That is a tribute to how good Linux is." - Linus Torvalds



Esse cara é brabo mesmo! Das antigas.

[3] Comentário enviado por maurixnovatrento em 20/11/2020 - 09:14h


Muito legal.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts