#pattern-matching #macro #group #capture

regexm

用于编写正则表达式模式匹配的 Rust 宏

7 个版本

0.2.1 2021年3月30日
0.2.0 2021年3月19日
0.2.0-beta.12021年2月14日
0.1.0 2021年1月31日

#48#capture

30 每月下载量

MIT 许可证

24KB
584 代码行数,不包括注释

regexm

用于编写正则表达式模式匹配的 Rust 宏。

github workflow status crates docs

用法 | 示例 | 文档

特性

  • 捕获组

依赖项

[dependencies]
regex = "1"
regexm = "0.2.1"

用法

简单模式匹配

fn main() {
    let text1 = "2020-01-01";
    regexm::regexm!(match text1 {
        r"^\d{4}$" => println!("yyyy"),
        r"^\d{4}-\d{2}$" => println!("yyyy-mm"),
        // block
        r"^\d{4}-\d{2}-\d{2}$" => {
            let yyyy_mm_dd = "yyyy-mm-dd";
            println!("{}", yyyy_mm_dd);
        }
        _ => println!("default"),
    });
}

输出

yyyy-mm-dd

生成的代码将是以下内容

fn main() {
    let text1 = "2020-01-01";
    if regex::Regex::new(r"^\d{4}$").unwrap().is_match(text1) {
        println!("yyyy")
    } else if regex::Regex::new(r"^\d{4}-\d{2}$").unwrap().is_match(text1) {
        println!("yyyy-mm")
    } else if regex::Regex::new(r"^\d{4}-\d{2}-\d{2}$")
        .unwrap()
        .is_match(text1)
    {
        let yyyy_mm_dd = "yyyy-mm-dd";
        println!("{}", yyyy_mm_dd);
    } else {
        println!("default")
    };
}

Let match

fn main() {
    let text2 = "foo";
    let foo = regexm::regexm!(match text2 {
        r"^\d{4}-\d{2}-\d{2}$" => "yyyy-mm-dd",
        r"^\d{4}-\d{2}$" => "yyyy-mm",
        // block
        r"^\d{4}-\d{2}-\d{2}$" => {
            let yyyy_mm_dd = "yyyy-mm-dd";
            yyyy_mm_dd
        }
        _ => "default",
    });
    println!("{}", foo);
}

输出

default

生成的代码将是以下内容

fn main() {
    let text2 = "foo";
    let foo = if regex::Regex::new(r"^\d{4}-\d{2}-\d{2}$")
        .unwrap()
        .is_match(text2)
    {
        "yyyy-mm-dd"
    } else if regex::Regex::new(r"^\d{4}-\d{2}$").unwrap().is_match(text2) {
        "yyyy-mm"
    } else if regex::Regex::new(r"^\d{4}-\d{2}-\d{2}$")
        .unwrap()
        .is_match(text2)
    {
        let yyyy_mm_dd = "yyyy-mm-dd";
        yyyy_mm_dd
    } else {
        "default"
    };
    println!("{}", foo);
}

捕获组

fn main() {
    let text1 = "2020-01-02";
    regexm::regexm!(match text1 {
        // capture groups
        captures(r"^(\d{4})-(\d{2})-(\d{2})$") => |caps| println!(
            "year: {}, month: {}, day: {}",
            caps.get(1).map_or("", |m| m.as_str()),
            caps.get(2).map_or("", |m| m.as_str()),
            caps.get(3).map_or("", |m| m.as_str())
        ),
        _ => println!("default"),
    });
}

输出

2020
01
02

生成的代码将是以下内容

fn main() {
    let text1 = "2020-01-02";
    if regex::Regex::new(r"^(\d{4})-(\d{2})-(\d{2})$")
        .unwrap()
        .is_match(text1)
    {
        let closure = |caps: regex::Captures| {
            println!(
                "year: {}, month: {}, day: {}",
                caps.get(1).map_or("", |m| m.as_str()),
                caps.get(2).map_or("", |m| m.as_str()),
                caps.get(3).map_or("", |m| m.as_str())
            )
        };
        closure(
            regex::Regex::new(r"^(\d{4})-(\d{2})-(\d{2})$")
                .unwrap()
                .captures(text1)
                .unwrap(),
        )
    } else {
        println!("default")
    };
}

依赖项

~2–3MB
~53K SLoC