正規表現なら lazy_regex

2025/01/09に公開

crate 紹介は意外にアクセスが稼げる、と味を占めたので。lazy_regex について紹介しておきます。zenn や Qiita で検索しても出てこないので、知名度が低そう。たぶん、みんな、使ってるとは思うんですが。記事にないということは「知らん人は知らん」ということだと思うので。

lazy_regex。名前を見れば大体わかると思うんですが、once_cell でラップされた regex です。

main.rs
use regex::Regex;

fn main() {
    let re = Regex::new(r"Hello (?<name>\w+)!").unwrap();
    let Some(caps) = re.captures("Hello Murphy!") else {
        println!("no match!");
        return;
    };
    println!("The name is: {}", &caps["name"]);
}

Rust で普通に regex 使うとこんな感じになるわけですが。これ、毎回 new するの?という気持ちになります。struct に持たせたりしてしのぐと思いますが。もっと気軽に使えるなら、それに越したことないですよね。

main.rs
use lazy_regex::regex;

fn main() {
    let re = regex!(r"Hello (?<name>\w+)!");
    let Some(caps) = re.captures("Hello Murphy!") else {
        println!("no match!");
        return;
    };
    println!("The name is: {}", &caps["name"]);
}

lazy_regex に置き換えた場合、こうなります。見てわかる通り、記法はほぼ同じ。regex をラップしているだけなので、関数も同等。これだけで毎回コンパイルされる悲しみをなかったことにできます。大変ハッピーというわけです。

一応副作用がないわけではなく、まず、依存する crate が増えるのでコンパイル時間もバイナリのサイズも大きくなります。あと、正規表現を動的に生成したい場合も向いていません。が、まあ、通常の正規表現の八割五分くらいは lazy_regex の方がいいんじゃないでしょうか。

ということで、Rust で正規表現したい方には lazy_regex おすすめです。

Discussion