3个版本
0.0.3 | 2023年7月20日 |
---|---|
0.0.2 | 2023年7月19日 |
0.0.1 | 2022年11月27日 |
25 在 #regex-parser
794 每月下载量
在 31 个crate中使用(通过 structre)
15KB
284 行
将正则表达式静态解析为结构体。
这避免了常见的正则表达式陷阱,例如
- 捕获索引错误
- 尝试获取不存在的捕获
- 正则表达式和获取字段使用的名称中捕获名称的脱节
安装
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浮点数解析库。如果这很重要,并且您有如何实现的想法,请提出一个问题!
依赖项
~3.5MB
~88K SLoC