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.