Regex
O crate regex fornece correspondência de regex em tempo linear (sem backtracking catastrófico como alguns motores).
Receita
[dependencies]
regex = "1"use regex::Regex;
fn main() {
let re = Regex::new(r"^\d+$").unwrap();
println!("{}", re.is_match("8080"));
}Quando usar isso: Análise de logs, validação, extração - prefira parse para números simples.
Exemplo de Trabalho
use regex::Regex;
fn extract_ports(log: &str) -> Vec<u16> {
let re = Regex::new(r"port=(\d+)").unwrap();
re.captures_iter(log)
.filter_map(|c| c.get(1)?.as_str().parse().ok())
.collect()
}
fn main() {
let log = "port=8080 ok\nport=3000 ok";
println!("{:?}", extract_ports(log));
}O que isso demonstra:
- Compile a regex uma vez, reutilize
captures_iterpara grupos- Combine com
parsepara saída tipada
Mergulho Profundo
RegexBuilder para limites de tamanho e sensibilidade a maiúsculas/minúsculas. LazyLock para regex estáticas para padrões globais.
Armadilhas
- Compilar em loop quente - Lento. Correção:
LazyLockouonce_cell. unwrapemRegex::new- Padrão inválido causa pânico em tempo de execução. Correção:?emfnque retornaResult.- Regex para HTML/XML - Frágil. Correção: Analisador adequado.
- Correspondências sobrepostas -
find_iterapenas não sobrepostas. - Classes Unicode -
\wé ciente de Unicode - atenção ao desempenho.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
split, parse | Padrões simples | Extração complexa |
nom / pest | Gramáticas | Regex rápida ok |
fancy-regex | Lookaround necessário | Prioridade de tempo linear |
FAQs
Custo de compilação?
Compile uma vez, reutilize.Sensível a maiúsculas/minúsculas?
RegexBuilder::case_insensitive.Substituir?
replace_all com sintaxe de expansão.Dividir regex?
Método split.Regex de bytes?
Regex::new em padrões &[u8].unsafe?
Não necessário - API segura.ReDoS?
Crate regex projetado para ser seguro.serde?
Armazene o `str` do padrão compilado de forma preguiçosa.testar?
assert em capturas.clippy?
trivial_regex avisa sobre padrões simples.Relacionados
Versões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.