4 个版本
0.0.4 | 2023 年 7 月 20 日 |
---|---|
0.0.3 | 2023 年 7 月 19 日 |
0.0.2 | 2023 年 7 月 19 日 |
0.0.1 | 2022 年 11 月 27 日 |
14 在 #regex-parser 中排名
783 每月下载次数
在 30 个 crate (4 个直接使用) 中使用
6KB
55 行
将正则表达式静态解析为结构体。
这避免了常见的正则表达式陷阱,例如
- 捕获索引错误
- 尝试获取不存在的捕获
- 正则表达式中的捕获名称与获取字段使用的名称不同步
安装
cargo add structre
使用
定义一个结构体,并使用此宏生成解析辅助结构体
#[structre("(?P<key>[^:]+): (?P<value>\\d+)")]
struct KV {
key: String,
value: usize,
}
实例化解析器,并使用它
let kv_parser = KV::parser();
let m: KV = kv_parser.parse("hi: 39393")?;
structre::Error::Field
结果仅在字段的 from_str
方法失败时出现 - 如果所有字段都是字符串,则只能获得 Error::NoMatch
。
解析器类型以 FromRegex
后缀:KVFromRegex
。
支持类型
解析的数据可以是具有命名字段的结构体或元组。
如果它具有命名字段
- 每个字段都必须有一个关联的命名捕获
- 每个命名捕获都必须有一个关联的字段
- 不能有未命名的捕获
- 结构体内部的结构体和元组不支持,因为没有明确正确的处理方式。
如果是元组
- 捕获的数量必须等于元组元素的数量
- 不能有命名捕获
- 嵌套元组是允许的
任何实现 std::str::FromStr
的字段都将工作。
注意:静态分析在任何非内联类型处停止(例如:struct MyData(SomeOtherData);
- 因此,如果 SomeOtherData
是元组或具有字段,这些将不会被检查,并且 SomeOtherData
将使用 FromStr
从单个捕获解析)。
限制
如上所述,可用的类型不多,因此只能检查上面的结构体。外部定义的类型将不会进行检查。
我本来希望能够确保正则表达式具有有效的数字字符,但由于上述原因以及关于正则表达式 AST 内容推理的困难,我不得不放弃这个想法。
当前不支持非Unicode解析。我没有找到ASCII浮点解析库。如果这很重要,并且您有如何实现的想法,请提出一个问题!
依赖项
~4–5.5MB
~105K SLoC