From 0416868f3a5c37a14cbc83f2fb1bf82396da9922 Mon Sep 17 00:00:00 2001 From: RickyRister Date: Sun, 8 Jun 2025 22:06:42 -0700 Subject: [PATCH] Implement support for regex --- cockatrice/src/game/filters/filter_string.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/cockatrice/src/game/filters/filter_string.cpp b/cockatrice/src/game/filters/filter_string.cpp index 535f25d3b..f5e9d69e9 100644 --- a/cockatrice/src/game/filters/filter_string.cpp +++ b/cockatrice/src/game/filters/filter_string.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -55,7 +56,11 @@ StringListString <- UnescapedStringListPart+ GenericQuery <- MatcherString # A String that can either be a normal string or a regex search string -MatcherString <- String +MatcherString <- RegexMatcher / NormalMatcher + +NormalMatcher <- String +RegexMatcher <- '/' RegexMatcherString '/' +RegexMatcherString <- ('\\/' / !'/' .)+ FlexStringValue <- CompactStringSet / String / [(] StringList [)] CompactStringSet <- StringListString ([,+] StringListString)+ @@ -263,7 +268,7 @@ static void setupParserRules() return QString::fromStdString(std::string(sv.sv())); }; - search["MatcherString"] = [](const peg::SemanticValues &sv) -> StringMatcher { + search["NormalMatcher"] = [](const peg::SemanticValues &sv) -> StringMatcher { auto target = std::any_cast(sv[0]); auto sanitizedTarget = QString(target); sanitizedTarget.replace("\\\"", "\""); @@ -271,6 +276,16 @@ static void setupParserRules() return [=](const QString &s) { return s.contains(sanitizedTarget, Qt::CaseInsensitive); }; }; + search["RegexMatcher"] = [](const peg::SemanticValues &sv) -> StringMatcher { + auto target = std::any_cast(sv[0]); + auto regex = QRegularExpression(target, QRegularExpression::CaseInsensitiveOption); + return [=](const QString &s) { return regex.match(s).hasMatch(); }; + }; + + search["RegexMatcherString"] = [](const peg::SemanticValues &sv) -> QString { + return QString::fromStdString(sv.token_to_string()); + }; + search["OracleQuery"] = [](const peg::SemanticValues &sv) -> Filter { const auto matcher = std::any_cast(sv[0]); return [=](const CardData &x) { return matcher(x->getText()); };