#regex-parser #capture #structs #index #helper #static-checked

structre_proc_macros

将正则表达式静态解析为结构体(助手crate)

3个版本

0.0.3 2023年7月20日
0.0.2 2023年7月19日
0.0.1 2022年11月27日

25#regex-parser

Download history 116/week @ 2024-05-03 136/week @ 2024-05-10 171/week @ 2024-05-17 169/week @ 2024-05-24 175/week @ 2024-05-31 129/week @ 2024-06-07 179/week @ 2024-06-14 157/week @ 2024-06-21 109/week @ 2024-06-28 114/week @ 2024-07-05 218/week @ 2024-07-12 239/week @ 2024-07-19 208/week @ 2024-07-26 175/week @ 2024-08-02 194/week @ 2024-08-09 184/week @ 2024-08-16

794 每月下载量
31 个crate中使用(通过 structre

ISC 许可证

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

解析器类型后缀为 FromRegexKVFromRegex

支持类型

解析的数据可以是一个带有命名字段的结构体或一个元组。

如果它有命名字段

  • 每个字段都必须有一个相关的命名捕获
  • 每个命名捕获都必须有一个相关的字段
  • 必须没有无名称捕获
  • 结构体内的嵌套结构和元组不支持,因为没有明确的正确处理方法。

如果是元组

  • 捕获的数量必须等于元组元素的数量
  • 必须没有命名捕获
  • 嵌套元组是可以的

实现 std::str::FromStr 的任何字段都可以工作。

注意:静态分析会在任何非内联类型处停止(例如:struct MyData(SomeOtherData); - 因此,如果 SomeOtherData 是一个元组或有字段,则这些将不会被检查,并且 SomeOtherData 将使用 FromStr 从单个捕获进行解析)。

局限性

如上所述,可用的类型不多,因此只能检查上述结构。外部定义的类型将不会被检查。

我原本希望确保正则表达式有有效的数字字符,但由于上述原因以及推理正则表达式AST内容的困难,我不得不放弃这一想法。

目前不支持非Unicode解析。我没有找到ASCII浮点数解析库。如果这很重要,并且您有如何实现的想法,请提出一个问题!

依赖项

~3.5MB
~88K SLoC