29 个版本
0.2.20 | 2023年12月5日 |
---|---|
0.2.19 | 2023年11月26日 |
0.2.18 | 2023年9月11日 |
0.2.16 | 2022年11月2日 |
0.2.1 | 2019年7月29日 |
#2 in #搜索算法
18,318 每月下载量
用于 sm_motion_photo
45KB
867 代码行
Boyer-Moore-MagicLen
此crate可以使用boyer-moore-magiclen(有时比boyer-moore和boyer-moore-horspool更快)在字符串中搜索子字符串或在任何序列中搜索任何子序列。
用法
对于二进制数据和UTF-8数据,使用BMByte
结构。对于字符序列,使用BMCharacter
结构(然而它比BMByte
慢得多)。BMCharacter
结构需要标准库支持,并且您必须启用character
功能才能使其可用。
每个BMXXX
都有一个关联的from
函数,可以通过搜索模式(即针)创建实例。
例如,
use boyer_moore_magiclen::BMByte;
let bmb = BMByte::from("oocoo").unwrap();
现在,我们可以搜索任何二进制数据或UTF-8数据中的模式oocoo
。
有两种搜索模式和两种搜索方向。第一种模式称为全文搜索,它找到匹配的子序列的位置,包括重叠的。
use boyer_moore_magiclen::BMByte;
let bmb = BMByte::from("oocoo").unwrap();
assert_eq!(vec![1, 4], bmb.find_full_in("coocoocoocoo", 2));
另一种模式称为普通文本搜索,它找到匹配的子序列的位置,不包括重叠的。
use boyer_moore_magiclen::BMByte;
let bmb = BMByte::from("oocoo").unwrap();
assert_eq!(vec![1, 7], bmb.find_in("coocoocoocoo", 2));
搜索方向可以是从头(向前搜索,find_xxx
)或从尾(向后搜索,rfind_xxx
)。
use boyer_moore_magiclen::BMByte;
let bmb = BMByte::from("oocoo").unwrap();
assert_eq!(vec![7, 1], bmb.rfind_in("coocoocoocoo", 2));
要一次搜索所有结果,请使用find_all_in
、rfind_all_in
、find_full_all_in
或rfind_full_all_in
方法。
use boyer_moore_magiclen::BMByte;
let bmb = BMByte::from("oocoo").unwrap();
assert_eq!(vec![7, 4, 1], bmb.rfind_full_all_in("coocoocoocoo"));
基准测试
cargo bench --bench full_text_search
或
cargo bench --bench normal_text_search
Crates.io
https://crates.io/crates/boyer-moore-magiclen
文档
https://docs.rs/boyer-moore-magiclen