3 个不稳定版本
使用旧的 Rust 2015
0.2.0 | 2017 年 5 月 4 日 |
---|---|
0.1.1 | 2016 年 2 月 3 日 |
0.1.0 | 2016 年 2 月 1 日 |
#10 in #along
8KB
98 行
将正则表达式匹配到结构体字段中
此 crate 受 alexflint/go-restructure 启发
此 crate 使用宏 regexify!
,它接受结构体及其子表达式的字段和模式。
#[macro_use(regexify)]
extern crate restructure;
extern crate regex;
use regex::Regex;
use restructure::{Restruct, RegexStruct};
regexify!(HostName {
domain, String, r"\w+"
_dot, String, r"\."
tld, String, r"\w+"
});
fn main() {
let host: HostName = Default::default();
let filled_host = Restruct::fill(&host, "example.com");
assert_eq!("example", filled_host.domain);
assert_eq!("com", filled_host.tld);
}
执行的正则表达式是结构体标签的连接
(?P<domain>\w+)\.(?P<tld>\w+)
您可以看到以 _
开头的字段没有被添加到正则表达式的捕获中。您可以使用 _
与作为分隔符或空白符的字段一起使用。
第一个子匹配被插入到 domain
字段中,下一个被插入到 tld
字段中。
宏的一般格式是
regexify!( <struct name> {
<field_name>, <field_type>, <pattern>
.
.
});
regexify!
可以处理混合类型的结构体,使您的任务更简单。
#![feature(cell_extras)]
#[macro_use(regexify)]
extern crate restructure;
extern crate regex;
use std::cell::{RefCell, Ref};
use regex::{Regex, Error};
use restructure::{Restruct, RegexStruct};
regexify!(MovieDetail {
title, String, r"'[^']+'"
_1, String, r"\s+\("
year, i32, r"\d+"
_2, String, r"\)"
});
fn main() {
let movie: MovieDetail = Default::default();
let not_my_favorite_movie = Restruct::fill(&movie, "Not my favorite movie: 'Citizen Kane' (1941).");
assert_eq!(r"'Citizen Kane'", not_my_favorite_movie.title);
assert_eq!(1941, not_my_favorite_movie.year);
}
regexify!
做了什么
除了声明指定的结构体外,它还在定义的结构体上实现了 RegexStruct
特性。它还应用了 std::default::Default
特性。
待办事项
- 嵌套结构体
- 更好的错误处理
- 可迭代的结构体
- JSON 转换(可选)
依赖关系
~3.5MB
~72K SLoC