diff --git a/src/fuzzy.cc b/src/fuzzy.cc new file mode 100644 index 00000000..8ab5a4a8 --- /dev/null +++ b/src/fuzzy.cc @@ -0,0 +1,41 @@ +#include "fuzzy.h" + +#include + +Matcher::Matcher(const std::string& search) { + std::string real_search; + real_search.reserve(search.size() * 3 + 2); + for (auto c : search) { + real_search += ".*"; + real_search += c; + } + real_search += ".*"; + + regex = std::regex(real_search, + std::regex_constants::ECMAScript | + std::regex_constants::icase | + std::regex_constants::optimize + //std::regex_constants::nosubs + ); +} + +bool Matcher::IsMatch(const std::string& value) { + //std::smatch match; + //return std::regex_match(value, match, regex); + return std::regex_match(value, regex, std::regex_constants::match_any); +} + +TEST_SUITE("Matcher"); + +TEST_CASE("sanity") { + Matcher m("abc"); + // TODO: check case + CHECK(m.IsMatch("abc")); + CHECK(m.IsMatch("fooabc")); + CHECK(m.IsMatch("fooabc")); + CHECK(m.IsMatch("abc")); + CHECK(m.IsMatch("abcfoo")); + CHECK(m.IsMatch("11a11b11c11")); +} + +TEST_SUITE_END(); diff --git a/src/fuzzy.h b/src/fuzzy.h new file mode 100644 index 00000000..dae20e5f --- /dev/null +++ b/src/fuzzy.h @@ -0,0 +1,10 @@ +#pragma once + +#include + +struct Matcher { + Matcher(const std::string& search); + + bool IsMatch(const std::string& value); + std::regex regex; +};