#regex #readable #raw #wrapper #build #verbose #readable-re

readable-regex

为人类设计的正则表达式。以详细风格构建正则表达式的包装器。

1 个不稳定版本

0.1.0-alpha12022年8月24日

#761 in 文本处理

自定义许可证

70KB
1.5K SLoC

可读正则表达式

MIT licensed Crates.io GHA Build Status Docs Badge

为人类设计的正则表达式。

为什么?

正则表达式很有用。但说真的,由于代码更多地被阅读而不是编写,正则表达式在详细模式下可能更容易理解。

readable-regex crate 是一组工具,用于以详细的方式构建这些正则表达式。其目的是提高代码的可读性。

它构建在已经非常优秀的 regexfancy-regex crate 的基础上。

添加依赖项

将依赖项添加到您的 Cargo.toml 文件中

readable-regex = "0.1.0"

用法

可用的 API

主要的包装器是 ReadableRe 枚举。

有两种主要方式使用它来构建正则表达式,要么使用 枚举 本身

use readable_regex::ReadableRe;
let query = ReadableRe::Raw("<some regex expression>");

要么通过使用围绕它的函数包装器

use readable_regex::raw_regex;
let query = raw_regex("<some regex expression>");

还可以组合它们

use readable_regex::{digit, group};
use readable_regex::ReadableRe::*;
let query = group(digit() + Digit + digit());
println!("{}", query.to_string());

示例

如何构建一个简单的日期匹配(如 presets 特性下 datetime 模块中实现的那样)

use once_cell::sync::Lazy;
use readable_regex::*;
use readable_regex::ReadableRe::*;

/// Month day, `01`-`31`
pub const DAY: Lazy<ReadableRe> = Lazy::new(|| {
    either([
        Raw("0") + chars("1-9"),
        chars("12") + chars("1-9"),
        Raw("3") + chars("01"),
    ])
});

/// Month numeral, `01`-`12`
pub const MONTH: Lazy<ReadableRe> =
    Lazy::new(|| either([Raw("0") + chars("1-9"), Raw("1") + chars("0-2")]));

/// Years from `1000` to `2999`
pub const YEAR: Lazy<ReadableRe> = Lazy::new(|| chars("12") + exactly(3, Digit));

/// Date Format `YYYY-MM-dd`
pub const DATE_Y_M_D: Lazy<ReadableRe> = Lazy::new(|| {
    group(
        group(YEAR.clone())
            + chars(r"-/.\\")
            + group(MONTH.clone())
            + chars(r"-/.\\")
            + group(DAY.clone()),
    )
});

assert!(DATE_Y_M_D.compile().unwrap().is_match("2022/04/18"));

致谢

这个库深受 Python Humre 包的启发。

依赖项

~0–730KB
~12K SLoC