Seqfuzz is an implementation of a sequential fuzzy string matching algorithm, similar to those used in code editors like Sublime Text. It is based on Forrest Smith's work on lib_ftps and his blog post Reverse Engineering Sublime Text's Fuzzy Match.

There is an alternate implementation by @WolfDan which can be found here: Fuzzy Match v0.2.0 Elixir.

Documentation

Installation

The package can be installed by adding seqfuzz to your list of dependencies in mix.exs:

def deps do
  [
    {:seqfuzz, "~> 0.2.0"}
  ]
end

Examples

  iex> Seqfuzz.match("Hello, world!", "hellw")
  %{match?: true, matches: [0, 1, 2, 3, 7], score: 202}

  iex> items = [{1, "Hello Goodbye"}, {2, "Hell on Wheels"}, {3, "Hello, world!"}]
  iex> Seqfuzz.filter(items, "hellw", &(elem(&1, 1)))
  [{3, "Hello, world!"}, {2, "Hell on Wheels"}]

Scoring

Scores can be passed as options if you want to override the defaults. I have added additional separators as a default as well as two additional scoring features: case match bonus and string match bonus. Case match bonus provides a small bonus for matching case. String match bonus provides a large bonus when the pattern and the string match exactly (although with different cases) to make sure that those results are always highest.

Changelog

Roadmap