Статический Regex
Статический Regex в Rust - это способ создания регулярного выражения,
который компилирует шаблон один раз и сохраняет результат в статической
переменной. Для этого используется макрос regex из крейта
regex совместно с std::sync::LazyLock или
once_cell::sync::Lazy. Такой подход позволяет избежать повторной
компиляции регулярного выражения при каждом вызове функции, что особенно
важно в высоконагруженных участках кода. Параметром макроса regex
выступает строковый литерал с шаблоном регулярного выражения.
Синтаксис
use regex::Regex;
use std::sync::LazyLock;
static RE: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"pattern").unwrap());
Пример
Давайте создадим статический Regex для поиска чисел в строке и проверим его работу:
use regex::Regex;
use std::sync::LazyLock;
static RE: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"\d+").unwrap());
fn main()
{
let res = RE.is_match("abc123");
println!("{}", res);
}
Результат выполнения кода:
true
Пример
Давайте найдём все совпадения с помощью статического Regex:
use regex::Regex;
use std::sync::LazyLock;
static RE: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"\d+").unwrap());
fn main()
{
let text = "abc123def456";
let res: Vec<&str> = RE.find_iter(text).map(|m| m.as_str()).collect();
println!("{:?}", res);
}
Результат выполнения кода:
["123", "456"]
Пример
Давайте заменим все вхождения чисел на звёздочки:
use regex::Regex;
use std::sync::LazyLock;
static RE: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"\d+").unwrap());
fn main()
{
let text = "abc123def456";
let res = RE.replace_all(text, "*");
println!("{}", res);
}
Результат выполнения кода:
"abc*def*"