Regex
The regex crate provides linear-time regex matching (no catastrophic backtracking like some engines).
Search across all documentation pages
The regex crate provides linear-time regex matching (no catastrophic backtracking like some engines).
[dependencies]
regex = "1"use regex::Regex;
fn main() {
let re = Regex::new(r"^\d+$").unwrap();
println!("{}", re.is_match("8080"));
}When to reach for this: Log parsing, validation, extraction - prefer parse for simple numbers.
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));
}What this demonstrates:
captures_iter for groupsparse for typed outputRegexBuilder for case insensitive, size limits. LazyLock static regex for global patterns.
LazyLock or once_cell.? in fn returning Result.find_iter non-overlapping only.\w Unicode-aware - mind performance.| Alternative | Use When | Don't Use When |
|---|---|---|
split, parse | Simple patterns | Complex extraction |
nom / pest | Grammars | Quick regex ok |
fancy-regex | Lookaround needed | Linear time priority |
Stack versions: This page was written for Rust 1.97.0 (edition 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, and Polars 0.46+.
Reviewed by Chris St. John·Last updated Jul 16, 2026