From d34a1910f9d9fae9c2a1717ed7c597da589743f5 Mon Sep 17 00:00:00 2001 From: Paul Carroll Date: Mon, 18 Aug 2025 10:29:08 -0400 Subject: [PATCH] refactor string matcher --- cockatrice/src/game/filters/filter_string.cpp | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/cockatrice/src/game/filters/filter_string.cpp b/cockatrice/src/game/filters/filter_string.cpp index 3261f54bb..3d168d64c 100644 --- a/cockatrice/src/game/filters/filter_string.cpp +++ b/cockatrice/src/game/filters/filter_string.cpp @@ -189,31 +189,23 @@ static void setupParserRules() }; search["StringValue"] = [](const peg::SemanticValues &sv) -> StringMatcher { - // Extract common matching logic with strict matching option - auto createMatcher = [](const QString &target, bool strictMatch = true) -> StringMatcher { - return [target, strictMatch](const QString &s) -> bool { - if (!strictMatch && s.contains(target, Qt::CaseInsensitive)) { - return true; - } - - // For strict mode, try both exact word matching and substring matching - if (s.split(" ").contains(target, Qt::CaseInsensitive)) { - return true; - } - - // Also check if the target appears as a substring (for multi-word terms) - return s.contains(target, Qt::CaseInsensitive); - }; + // Helper function for word boundary matching + auto createWordBoundaryMatcher = [](const QString &target) { + QString pattern = QString("\\b%1\\b").arg(QRegularExpression::escape(target)); + QRegularExpression regex(pattern, QRegularExpression::CaseInsensitiveOption); + return [regex](const QString &s) { return regex.match(s).hasMatch(); }; }; if (sv.choice() == 0) { const auto target = std::any_cast(sv[0]); - return createMatcher(target, true); // Use strict matching + return createWordBoundaryMatcher(target); } const auto target = std::any_cast(sv[0]); - return [=](const QString &s) -> bool { - auto containsString = [&](const QString &str) { return createMatcher(str, true)(s); }; + return [=](const QString &s) { + auto containsString = [&s, &createWordBoundaryMatcher](const QString &str) { + return createWordBoundaryMatcher(str)(s); + }; return std::any_of(target.begin(), target.end(), containsString); }; };