11 个版本

0.3.7 2020年10月4日
0.3.6 2020年10月3日
0.3.5 2020年7月5日
0.3.4 2020年2月23日
0.1.0 2019年3月2日

#29 in 文本处理

Download history 31339/week @ 2024-03-14 35329/week @ 2024-03-21 34188/week @ 2024-03-28 35010/week @ 2024-04-04 38720/week @ 2024-04-11 36404/week @ 2024-04-18 35786/week @ 2024-04-25 40732/week @ 2024-05-02 37925/week @ 2024-05-09 39706/week @ 2024-05-16 38630/week @ 2024-05-23 37760/week @ 2024-05-30 38648/week @ 2024-06-06 40969/week @ 2024-06-13 39566/week @ 2024-06-20 33674/week @ 2024-06-27

159,654 每月下载量
用于 399 个 crate (118 直接)

MIT 许可证

67KB
1.5K SLoC

Crates.io

模糊匹配器

Rust 中的模糊匹配算法!

用法

在您的 Cargo.toml 中添加以下内容

[dependencies]
fuzzy-matcher = "*"

以下是一些代码示例

use fuzzy_matcher::FuzzyMatcher;
use fuzzy_matcher::skim::SkimMatcherV2;

let matcher = SkimMatcherV2::default();
assert_eq!(None, matcher.fuzzy_match("abc", "abx"));
assert!(matcher.fuzzy_match("axbycz", "abc").is_some());
assert!(matcher.fuzzy_match("axbycz", "xyz").is_some());

let (score, indices) = matcher.fuzzy_indices("axbycz", "abc").unwrap();
assert_eq!(indices, [0, 2, 4]);
  • fuzzy_match 只返回分数,而 fuzzy_indices 返回匹配的索引。
  • 两个函数如果模式不匹配,都返回 None。
  • 分数越高越好。

更多示例

echo "axbycz" | cargo run --example fz "abc" 然后检查发生了什么。

关于算法

浏览

浏览当前由 skim 使用, skim 是一个模糊查找器。

浏览 V2

  • 与 fzf v2 类似,该算法基于 Smith-Waterman 算法,通常用于 DNA 序列比对。
  • 有关更多详细信息,请参阅 https://www.cs.cmu.edu/~ckingsf/bioinfo-lectures/gaps.pdf
  • 时间复杂度为 O(mn),其中 m, n 分别是模式和输入行的长度。
  • 对于 fuzzy_indices,空间复杂度为 O(mn),对于 fuzzy_match,空间复杂度为 O(2n),它将压缩动态规划的表。
  • V2 匹配器有一个选项可以设置分数矩阵的最大元素,如果 m*n 超过限制,它将回退到线性搜索。

浏览 V1

Clangd

  • 该算法基于 clangd的FuzzyMatch.cpp
  • 也可以查看 https://github.com/lewang/flx/issues/98 以获取一些变体。
  • 算法的时间复杂度为 O(mn),其中 m, n 分别是模式串和输入行的长度。
  • 对于 fuzzy_indices,空间复杂度为 O(mn),对于 fuzzy_match,空间复杂度为 O(2n),它将压缩动态规划的表。

依赖关系

~87KB