Expressões Regulares em Rust com Exemplos: Na Prática

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Expressões Regulares em Rust com Exemplos: Na Prática

\n\n

Expressões regulares (regex) são uma ferramenta poderosa para trabalhar com texto. Em Rust, apesar da tipagem forte e do foco em segurança, o trabalho com expressões regulares é implementado de forma eficiente e conveniente graças à crate regex. Neste artigo, vamos explorar como usar expressões regulares em Rust na prática: desde a instalação até cenários complexos de processamento de strings.

\n\n

Abordaremos as operações principais: busca, extração, substituição e validação. Todos os exemplos de código estão escritos em Rust e prontos para uso.

\n\n

Instalação e Adição da Crate regex

\n\n

Para trabalhar com expressões regulares em Rust, utiliza-se uma crate de terceiros, mas muito popular, chamada regex. Ela não faz parte da biblioteca padrão, portanto, precisa ser adicionada ao projeto.

\n\n

Adicione a dependência no arquivo Cargo.toml:

\n\n
[dependencies]\nregex = "1"
\n\n

Depois disso, no código, você pode importar os tipos principais:

\n\n
use regex::Regex;
\n\n

A crate regex compila a expressão regular em um autômato finito, o que garante alta performance. Erros de compilação do padrão são capturados em tempo de execução (através de Result), tornando o código confiável.

\n\n

Fundamentos: Busca de Correspondências em uma String

\n\n

A maneira mais simples de verificar se uma string corresponde a um padrão é usar o método is_match. Vejamos um exemplo de verificação da presença de um endereço de e-mail em um texto.

\n\n
use regex::Regex;\n\nfn main() {\n    let re = Regex::new(r"\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b").unwrap();\n    let text = "Entre em contato conosco pelo e-mail support@example.com.";\n\n    if re.is_match(text) {\n        println!("E-mail encontrado!");\n    } else {\n        println!("E-mail não encontrado.");\n    }\n}
\n\n

O método Regex::new recebe uma string com o padrão e retorna um Result. O unwrap() é usado aqui por simplicidade, mas em código de produção, os erros devem ser tratados adequadamente.

\n\n

Para buscar todas as correspondências, usa-se o método find_iter, que retorna um iterador de objetos Match:

\n\n
use regex::Regex;\n\nfn main() {\n    let re = Regex::new(r"\\d+").unwrap();\n    let text = "Preços: 100, 250 e 500 reais.";\n\n    for mat in re.find_iter(text) {\n        println!("Número encontrado: {}", mat.as_str());\n    }\n}
\n\n

Este código exibirá:

\n\n
Número encontrado: 100\nNúmero encontrado: 250\nNúmero encontrado: 500
\n\n

Extração de Dados com Grupos de Captura

\n\n

Grupos de captura (capturing groups) permitem extrair não apenas a correspondência inteira, mas partes específicas dela. Por exemplo, analisar uma data no formato "dd-mm-aaaa".

\n\n
use regex::Regex;\n\nfn main() {\n    let re = Regex::new(r"(\\d{2})-(\\d{2})-(\\d{4})").unwrap();\n    let text = "Hoje é 15-03-2024.";\n\n    if let Some(caps) = re.captures(text) {\n        println!("Dia: {}", &caps[1]);\n        println!("Mês: {}", &caps[2]);\n        println!("Ano: {}", &caps[3]);\n    }\n}
\n\n

A indexação dos grupos começa em 1 (o grupo 0 é a correspondência inteira). O método captures retorna um Option<Captures>. Se uma correspondência for encontrada, podemos acessar os grupos pelo índice.

\n\n

Para extrair todas as ocorrências com grupos, usa-se captures_iter:

\n\n
use regex::Regex;\n\nfn main() {\n    let re = Regex::new(r"(\\w+)@(\\w+)\\.(\\w+)").unwrap();\n    let text = "emails: user@host.com, admin@site.org";\n\n    for caps in re.captures_iter(text) {\n        println!("Login: {}, domínio: {}, zona: {}", &caps[1], &caps[2], &caps[3]);\n    }\n}
\n\n

Esta abordagem é indispensável ao fazer parsing de logs, arquivos de configuração ou extrair dados estruturados de texto não estruturado.

\n\n

Substituição de Texto por Padrão

\n\n

A crate regex

Blogs

Book Recommendations