3 个不稳定版本

使用旧的 Rust 2015

0.2.0 2017 年 5 月 4 日
0.1.1 2016 年 2 月 3 日
0.1.0 2016 年 2 月 1 日

#10 in #along

MIT 许可证

8KB
98

Crates.io rust-stable crate-doc

将正则表达式匹配到结构体字段中

此 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