diff --git a/cockatrice/src/filter_string.cpp b/cockatrice/src/filter_string.cpp index e45108cf..ea07dede 100644 --- a/cockatrice/src/filter_string.cpp +++ b/cockatrice/src/filter_string.cpp @@ -42,9 +42,10 @@ ColorQuery <- [cC] 'olor'? <[iI]?> <[:!]> ColorEx* FieldQuery <- String [:] RegexString / String ws? NumericExpression -NonQuote <- !["]. -UnescapedStringListPart <- ![":<>=! ]. -String <- UnescapedStringListPart+ / ["] ["] +NonDoubleQuoteUnlessEscaped <- !["]. / '\"'. +NonSingleQuoteUnlessEscaped <- ![']. / "\'". +UnescapedStringListPart <- !['":<>=! ]. +String <- UnescapedStringListPart+ / ["] ["] / ['] ['] StringValue <- String / [(] StringList [)] StringList <- StringListString (ws? [,] ws? StringListString)* StringListString <- UnescapedStringListPart+ @@ -56,7 +57,7 @@ CompactStringSet <- StringListString ([,+] StringListString)+ NumericExpression <- NumericOperator ws? NumericValue NumericOperator <- [=:] / <[> -NumericValue <- [0-9]+ +NumericValue <- [0-9]+ )"); @@ -242,7 +243,12 @@ static void setupParserRules() search["RegexString"] = [](const peg::SemanticValues &sv) -> StringMatcher { auto target = sv[0].get(); - return [=](const QString &s) { return s.QString::contains(target, Qt::CaseInsensitive); }; + return [=](const QString &s) { + auto sanitizedTarget = QString(target); + sanitizedTarget.replace("\\\"", "\""); + sanitizedTarget.replace("\\'", "'"); + return s.QString::contains(sanitizedTarget, Qt::CaseInsensitive); + }; }; search["OracleQuery"] = [](const peg::SemanticValues &sv) -> Filter {