Crates.io | sublime_fuzzy |
lib.rs | sublime_fuzzy |
version | 0.7.0 |
source | src |
created_at | 2017-07-25 10:15:35.865712 |
updated_at | 2020-12-19 14:28:54.354783 |
description | Fuzzy matching algorithm based on Sublime Text's string search. |
homepage | |
repository | https://github.com/Schlechtwetterfront/fuzzy-rs |
max_upload_size | |
id | 25002 |
size | 52,365 |
Fuzzy matching algorithm based on Sublime Text's string search. Iterates through characters of a search string and calculates a score.
The score is based on several factors:
t
in some_thing
get a bonus (bonus_word_start
)bonus_consecutive
)T
-> T
instead of t
-> T
) in case of a case-insensitive search get a bonus (bonus_match_case
)penalty_distance
penalty and subtracted from the scoreThe default scoring is configured to give a lot of weight to word starts. So a pattern scc
will match
SoccerCartoonController, not SoccerCartoonController.
With default weighting.
Pattern | Target string | Result |
---|---|---|
scc |
SoccerCartoonController |
SoccerCartoonController |
something |
some search thing |
some search thing |
Basic usage:
use sublime_fuzzy::best_match;
let result = best_match("something", "some search thing");
assert!(result.is_some());
Match::continuous_matches
returns an iter of consecutive matches. Based on those the input
string can be formatted.
format_simple
provides a simple formatting that wraps matches in tags:
use sublime_fuzzy::{best_match, format_simple};
let target = "some search thing";
let result = best_match("something", target).unwrap();
assert_eq!(
format_simple(&result, target, "<span>", "</span>"),
"<span>some</span> search <span>thing</span>"
);
The weighting of the different factors can be adjusted:
use sublime_fuzzy::{FuzzySearch, Scoring};
// Or pick from one of the provided `Scoring::...` methods like `emphasize_word_starts`
let scoring = Scoring {
bonus_consecutive: 128,
bonus_word_start: 0,
..Scoring::default()
};
let result = FuzzySearch::new("something", "some search thing")
.case_sensitive()
.score_with(&scoring)
.best_match();
assert!(result.is_some())
Note: Any whitespace in the pattern ('something'
in the examples above) will be removed.
Check out the documentation at docs.rs.