#pattern #dsl #docs #language #procedural #proc-macro #domain-specific

doc-search-dsl-macro

用于实现文档搜索领域特定语言的进程宏

1 个不稳定版本

0.1.0 2024年8月3日

#1537过程宏

Download history 131/week @ 2024-07-31 12/week @ 2024-08-07

143 次每月下载
用于 doc-search-dsl

MIT 许可证

11KB
121

文档搜索DSL (doc_search_dsl)

一个用于使用领域特定语言(DSL)创建复杂正则表达式的Rust过程宏。此DSL允许您定义可以用于具有自定义Rule枚举的高级文本匹配和处理的分层正则表达式模式。

安装

cargo add doc_search_dsl lazy_regex

使用方法

以下是如何使用DSL的基本示例

use doc_search_dsl::{pat, Rule};

fn main() {
    let content = vec![
        "Once upon a midnight dreary, while I pondered, weak and weary,",
        "Over many a quaint and curious volume of forgotten lore—",
        "While I nodded, nearly napping, suddenly there came a tapping,",
        "As of some one gently rapping, rapping at my chamber door.",
        "''Tis some visitor,' I muttered, 'tapping at my chamber door—",
        "Only this and nothing more.",
    ];

    let p = pat! {
        all {
            "nodded",
            "WHILE"i,
            "nothing"
        }
    };

    assert!(matches!(p, Rule::And(_)));
    assert_eq!(p.occurances(&content), 1);
}

此示例创建一个模式,如果“nodded”、“WHILE”(不区分大小写)和“nothing”全部出现在内容中,则匹配。

模式类型

让我们探索不同类型的模式,从简单到复杂

1. 单一模式

最简单的模式匹配单个字符串

let p = pat!("dreary");
assert!(matches!(p, Rule::One(_)));
assert_eq!(p.occurances(&content), 1);

这匹配包含“dreary”的任何行。

2. 带标志的单一模式

您可以添加标志来修改模式的行为

let p = pat!("WHILE"i);
assert!(matches!(p, Rule::One(_)));
assert_eq!(p.occurances(&content), 2);

i 标志使模式不区分大小写,因此它匹配“While”和“while”。

3. 任意(OR)模式

any 模式匹配如果其子模式中的任何一个匹配

let p = pat! {
    any {
        "dreary",
        "curious",
        "tapping"
    }
};
assert!(matches!(p, Rule::Or(_)));
assert_eq!(p.occurances(&content), 3);

这匹配包含“dreary”、“curious”或“tapping”的行。

4. 所有(AND)模式

all 模式匹配如果其所有子模式都匹配

let p = pat! {
    all {
        "while",
        "pondered",
        "weary"
    }
};
assert!(matches!(p, Rule::And(_)));
assert_eq!(p.occurances(&content), 1);

只有当“while”、“pondered”和“weary”都出现在内容中时才匹配。

5. 序列模式

sequence 模式按顺序匹配其子模式

let p = pat! {
    sequence {
        "Once upon",
        "midnight",
        "dreary"
    }
};
assert!(matches!(p, Rule::Sequence(_)));
assert_eq!(p.occurances(&content), 1);

这匹配“Once upon”、“midnight”和“dreary”的特定顺序。

6. 嵌套模式

您可以嵌套模式以进行更复杂的匹配

let p = pat! {
    any {
        all {
            "dreary",
            "weary"
        },
        sequence {
            "tapping",
            "rapping"
        }
    }
};
assert!(matches!(p, Rule::Or(_)));
assert_eq!(p.occurances(&content), 2);

这匹配(“dreary”和“weary”两者都存在)或(“tapping”后跟“rapping”)。

7. 复杂模式

这是一个结合了各种模式类型的更复杂示例

let p = pat! {
    all {
        any {
            "dreary",
            "curious"
        },
        sequence {
            "while"i,
            pat!("I \\w+")  // Matches "I" followed by any word
        },
        pat!(".*more.$")  // Matches lines ending with "more."
    }
};
assert!(matches!(p, Rule::And(_)));
assert_eq!(p.occurances(&content), 1);

此模式匹配包含以下内容的内容

  1. 包含“dreary”或“curious”,并且
  2. “while”(不区分大小写)后跟“I”和任何单词,并且
  3. 文件结尾带有 "more"。

结论

此DSL提供了一种灵活直观的方式来在Rust中创建复杂的正则表达式模式。通过组合不同的模式类型并将它们嵌套,您可以创建定制的强大搜索模式,以满足您的特定需求。

有关可用方法和高级使用的更详细信息,请参阅API文档。

依赖项

约250-700KB
约17K SLoC