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.