Aprofundando-se nas Expressões Regulares Avançadas

Expressões regulares (regex) são ferramentas poderosas para correspondência de padrões e manipulação de texto. Indo além do básico, este tutorial explora conceitos avançados de regex para lidar com tarefas complexas de processamento de texto.

Asserções Lookaround Avançadas

As asserções lookaround permitem que você corresponda a um padrão somente se ele for precedido ou seguido por outro padrão, sem incluir o texto ao redor na correspondência.

  • Lookahead positivo (?=...): Garante que o padrão corresponda apenas se for seguido pela expressão especificada.
  • Negative Lookahead (?!...): Garante que o padrão corresponda apenas se não for seguido pela expressão especificada.
  • Lookbehind positivo (?<=...): Garante que o padrão corresponda apenas se for precedido pela expressão especificada.
  • Negativo Lookbehind (?<!...): Garante que o padrão corresponda apenas se não for precedido pela expressão especificada.

Exemplo:

(?<=\$)\d+

Este regex corresponde a números precedidos por um cifrão.

Grupos Atômicos

Os grupos atômicos evitam o retrocesso quando uma tentativa de correspondência é feita dentro do grupo. Eles são úteis para melhorar o desempenho, evitando retrocessos desnecessários.

Exemplo:

(?>\d+)\b

Este regex corresponde a uma sequência de dígitos como um grupo atômico, evitando retrocesso.

Referências anteriores

As referências anteriores permitem reutilizar um grupo capturado anteriormente em seu padrão regex. Isto é útil para combinar substrings repetidas.

Exemplo:

(\b\w+)\s+\1

Este regex corresponde a uma palavra seguida pela mesma palavra.

Grupos Nomeados

Os grupos nomeados permitem atribuir nomes aos grupos de captura, tornando seu regex mais legível e os dados correspondentes mais fáceis de referenciar.

Exemplo:

(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})

Este regex corresponde às datas no formato AAAA-MM-DD e nomeia os grupos de ano, mês e dia.

Padrões Recursivos

Os padrões recursivos permitem que uma regex corresponda a estruturas aninhadas, como parênteses balanceados. Este é um recurso avançado suportado por alguns mecanismos regex.

Exemplo:

\((?>[^()]+|(?R))*\)

Este regex corresponde aos parênteses balanceados.

Usando Regex em diferentes linguagens de programação

Regex é compatível com muitas linguagens de programação, geralmente com pequenas variações na sintaxe e nos recursos. Aqui estão exemplos em Python e JavaScript:

Exemplo de Python

import re

# Match a word followed by the same word
pattern = r'(\b\w+)\s+\1'
text = 'hello hello world'
match = re.search(pattern, text)

if match:
    print('Match found:', match.group())
else:
    print('No match found')

Exemplo de JavaScript

// Match a word followed by the same word
const pattern = /(\b\w+)\s+\1/;
const text = 'hello hello world';
const match = text.match(pattern);

if (match) {
    console.log('Match found:', match[0]);
} else {
    console.log('No match found');
}

Conclusão

Conceitos avançados de regex, como asserções lookaround, grupos atômicos, referências anteriores, grupos nomeados e padrões recursivos podem aprimorar significativamente seus recursos de processamento de texto. Ao dominar essas técnicas, você poderá realizar tarefas complexas de correspondência e manipulação com maior eficiência e precisão.