Desbloqueando o poder das expressões regulares avançadas

Expressões regulares (regex) fornecem ferramentas robustas para correspondência de padrões e manipulação de texto. Este artigo explora conceitos avançados de regex que permitem que você execute tarefas complexas de processamento de texto com precisão e eficiência.

Asserções Lookahead e Lookbehind

As asserções lookahead e lookbehind permitem que você corresponda a um padrão somente se for precedido ou seguido por outro padrão. Eles são úteis para garantir o contexto sem incluí-lo na partida.

  • 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:

(?<=Mr\.\s|Mrs\.\s)[A-Z]\w+

Esta regex corresponde a nomes precedidos por "Mr." ou "Mrs.".

Padrões Condicionais

Os padrões condicionais permitem combinar diferentes padrões com base no atendimento de uma determinada condição. A sintaxe é (?(condição)true-pattern|false-pattern).

Exemplo:

(\d{3}-)?(?(1)\d{3}-\d{4}|\d{7})

Este regex corresponde a números de telefone com ou sem código de área.

Sub-rotinas e recursão

Sub-rotinas e recursão permitem reutilizar padrões dentro do mesmo regex ou combinar estruturas aninhadas. Isto é especialmente útil para dados complexos e aninhados.

Exemplo:

(?<group>\((?>[^()]+|(?&group))*\))

Este regex combina parênteses balanceados com níveis aninhados.

Quantificadores Possessivos

Quantificadores possessivos evitam que o mecanismo regex retroceda, o que pode melhorar o desempenho quando você deseja garantir que nenhum retrocesso ocorra.

Exemplo:

\w++

Este regex corresponde a uma sequência de caracteres de palavras de forma possessiva, o que significa que não desistirá dos caracteres depois de correspondidos.

Usando sinalizadores para correspondência aprimorada

Os sinalizadores Regex modificam o comportamento da correspondência de padrões. Alguns sinalizadores comuns incluem:

  • i: Correspondência sem distinção entre maiúsculas e minúsculas.
  • m: Modo multilinha, afetando o comportamento de ^ e $.
  • s: Modo Dotall, permitindo que . corresponda a caracteres de nova linha.
  • x: Ignore os espaços em branco e permita comentários dentro do padrão para facilitar a leitura.

Exemplo:

/pattern/imsx

Esse padrão aplica os modos sem distinção entre maiúsculas e minúsculas, multilinha, ponto e estendido.

Exemplos em linguagens de programação

Aqui estão alguns exemplos de uso de regex avançado em Python e JavaScript:

Exemplo de Python

import re

# Match a name preceded by Mr. or Mrs.
pattern = r'(?<=Mr\.|Mrs\.)\s[A-Z]\w+'
text = 'Mr. Smith and Mrs. Johnson'
matches = re.findall(pattern, text)

for match in matches:
    print('Match found:', match)

Exemplo de JavaScript

// Match a name preceded by Mr. or Mrs.
const pattern = /(?<=Mr\.|Mrs\.)\s[A-Z]\w+/g;
const text = 'Mr. Smith and Mrs. Johnson';
const matches = text.match(pattern);

if (matches) {
    matches.forEach(match => console.log('Match found:', match));
}

Conclusão

Técnicas avançadas de regex, como asserções lookbehind, padrões condicionais, sub-rotinas, recursão e quantificadores possessivos, expandem os recursos de regex para processamento de texto complexo. Dominar esses conceitos permite lidar com tarefas sofisticadas de correspondência e manipulação com maior eficiência e precisão.