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

Closes #909
pull/925/head
Oleksii Holub 2 years ago
parent 92cf886eab
commit 612c6d37a4

@ -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
);

@ -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,

Loading…
Cancel
Save