Make contains filter match on spaces and input boundaries, as well as word boundaries

Closes #909
This commit is contained in:
Oleksii Holub
2022-08-25 21:26:56 +03:00
parent 92cf886eab
commit 612c6d37a4
2 changed files with 10 additions and 2 deletions

View File

@@ -10,11 +10,19 @@ internal class ContainsMessageFilter : MessageFilter
public ContainsMessageFilter(string text) => _text = text;
// Match content within word boundaries, between spaces, or as the whole input.
// For example, "max" shouldn't match on content "our maximum effort",
// but should match on content "our max effort".
// Also, "(max)" should match on content "our (max) effort", even though
// parentheses are not considered word characters.
// https://github.com/Tyrrrz/DiscordChatExporter/issues/909
private bool IsMatch(string? content) =>
!string.IsNullOrWhiteSpace(content) &&
Regex.IsMatch(
content,
"\\b" + Regex.Escape(_text) + "\\b",
@"(?=\b|\s|^)" +
Regex.Escape(_text) +
@"(?=\b|\s|$)",
RegexOptions.IgnoreCase | RegexOptions.CultureInvariant
);

View File

@@ -70,7 +70,7 @@ internal static class FilterGrammar
.Named("has:<value>");
// Make sure that property-based filters like 'has:link' don't prevent text like 'hello' from being parsed.
// https://github.com/Tyrrrz/DiscordChatExporter/issues/909
// https://github.com/Tyrrrz/DiscordChatExporter/issues/909#issuecomment-1227575455
private static readonly TextParser<MessageFilter> PrimitiveFilter =
Parse.OneOf(
FromFilter,