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 中排名

Download history 112/week @ 2024-05-03 133/week @ 2024-05-10 168/week @ 2024-05-17 166/week @ 2024-05-24 171/week @ 2024-05-31 123/week @ 2024-06-07 176/week @ 2024-06-14 153/week @ 2024-06-21 109/week @ 2024-06-28 131/week @ 2024-07-05 220/week @ 2024-07-12 226/week @ 2024-07-19 209/week @ 2024-07-26 168/week @ 2024-08-02 190/week @ 2024-08-09 185/week @ 2024-08-16

783 每月下载次数
30 个 crate (4 个直接使用) 中使用

ISC 许可证

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