1 个不稳定版本
0.1.0 | 2024年8月3日 |
---|
491 在 Rust模式 中
每月141 次下载
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);
此模式匹配内容,
- 包含“dreary”或“curious”,并且
- 具有“while”(不区分大小写)后跟“I”和任何单词,并且
- 具有以“more.”结尾的行。
结论
此DSL提供了一种灵活直观的方法来在Rust中创建复杂的正则表达式模式。通过组合不同的模式类型并嵌套它们,你可以创建针对特定需求定制的强大搜索模式。
有关可用方法和高级使用的更详细信息,请参阅API文档。
依赖项
~3.5–5MB
~95K SLoC