#dsl #proc-macro #complex #hierarchical #language #docs #matching

bin+lib doc-search-dsl

A Rust过程宏,用于使用领域特定语言(DSL)创建复杂的正则表达式模式。

1 个不稳定版本

0.1.0 2024年8月3日

491Rust模式

Download history 122/week @ 2024-07-29 19/week @ 2024-08-05

每月141 次下载

MIT 许可证

8KB
62

Doc Search DSL (doc_search_dsl)

A Rust过程宏,用于使用领域特定语言(DSL)创建复杂的正则表达式模式。这个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文档。

依赖项

~3.5–5MB
~95K SLoC