1 个不稳定版本
0.1.0 | 2024年8月3日 |
---|
#1537 在 过程宏 中
143 次每月下载
用于 doc-search-dsl
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);
此模式匹配包含以下内容的内容
- 包含“dreary”或“curious”,并且
- “while”(不区分大小写)后跟“I”和任何单词,并且
- 文件结尾带有 "more"。
结论
此DSL提供了一种灵活直观的方式来在Rust中创建复杂的正则表达式模式。通过组合不同的模式类型并将它们嵌套,您可以创建定制的强大搜索模式,以满足您的特定需求。
有关可用方法和高级使用的更详细信息,请参阅API文档。
依赖项
约250-700KB
约17K SLoC