Dominando Expressões Regulares Complexas

Expressões regulares (regex) são ferramentas versáteis para correspondência de padrões e manipulação de texto. Este tutorial explora técnicas avançadas de regex que ajudam você a gerenciar cenários complexos de processamento de texto com mais eficiência.

Asserções retrospectivas

As asserções lookbehind permitem que você corresponda a um padrão somente se ele for precedido por outro padrão. Isto é útil para garantir o contexto sem incluí-lo na partida.

  • Positivo Lookbehind (?<=...): Corresponde ao padrão apenas se ele for precedido pela expressão especificada.
  • Negativo Lookbehind (?<!...): Corresponde ao padrão apenas se ele não for precedido pela expressão especificada.

Exemplo:

(?<=Mr\.|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}-)?\d{3}-\d{4}

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.