| Crates.io | regex_capture |
| lib.rs | regex_capture |
| version | 0.1.1 |
| created_at | 2025-01-18 14:00:04.055417+00 |
| updated_at | 2025-03-17 13:05:11.651708+00 |
| description | Auto implement FromStr trait for struct with regex capture |
| homepage | |
| repository | |
| max_upload_size | |
| id | 1521650 |
| size | 12,006 |
regex_capture是一个宏,用于根据正则表达式为结构体实现FromStr trait.
示例如下:
#[derive(PartialEq, Debug)]
enum Gender {
Male,
Female,
}
fn gender_parser(s: &str) -> Result<Gender, String> {
match s {
"male" => Ok(Gender::Male),
"female" => Ok(Gender::Female),
_ => Err("invalid gender".to_string()),
}
}
#[derive(RegexCapture)]
#[converter(regex = r"name=(?P<name>.+?), age=(?P<age>\d+), gender=(?P<gender>male|female)")]
struct Person {
name: String,
age: u32,
#[converter(func = gender_parser)]
gender: Gender,
}
其中, #[converter(regex = ...)]指定一个正则表达式, 该表达式必须包含和结构体中所有字段同名的捕获;
#[converter(func = ...)]为特定字段指定转换函数, 该函数类型为&str -> Result, 用于将正则表达式的捕获转换为字段类型.
未指定转换函数的字段, 会调用parse方法, 你也可以自行为其类型实现相应trait;
之后, 你可以使用如下方法来将字符串解析为结构体:
static PERSON_STR: &str = "name=Chihaya Anon, age=15, gender=female";
let pre = Person::from_str(PERSON_STR).unwrap();
assert_eq!(pre.gender, Gender::Female);
assert_eq!(pre.age, 15);
assert_eq!(pre.name, "Chihaya Anon");