diff --git a/osu.Game.Tests/NonVisual/Filtering/FilterMatchingTest.cs b/osu.Game.Tests/NonVisual/Filtering/FilterMatchingTest.cs index eb75f75dee..345076652a 100644 --- a/osu.Game.Tests/NonVisual/Filtering/FilterMatchingTest.cs +++ b/osu.Game.Tests/NonVisual/Filtering/FilterMatchingTest.cs @@ -219,6 +219,46 @@ namespace osu.Game.Tests.NonVisual.Filtering ClassicAssert.AreEqual(filtered, carouselItem.Filtered.Value); } + [Test] + [TestCase("\"quoted words\"", false)] + [TestCase("\"the artist\"", false)] + [TestCase("the artist \"quoted words\"", false)] + [TestCase("\"unknown\"", true)] + public void TestCriteriaMatchingTermsAdjacentToPunctuation(string terms, bool filtered) + { + var exampleBeatmapInfo = getExampleBeatmap(); + exampleBeatmapInfo.Metadata.Title = "the artist \"quoted words\""; + var criteria = new FilterCriteria + { + Ruleset = new RulesetInfo { OnlineID = 6 }, + AllowConvertedBeatmaps = true, + SearchText = terms + }; + var carouselItem = new CarouselBeatmap(exampleBeatmapInfo); + carouselItem.Filter(criteria); + ClassicAssert.AreEqual(filtered, carouselItem.Filtered.Value); + } + + [Test] + [TestCase("~quoted words~", false)] + [TestCase("the artist", false)] + [TestCase("the artist ~quoted words~", false)] + [TestCase("~unknown~", true)] + public void TestCriteriaMatchingTermsAdjacentToMathSymbols(string terms, bool filtered) + { + var exampleBeatmapInfo = getExampleBeatmap(); + exampleBeatmapInfo.Metadata.Title = "the artist ~quoted words~"; + var criteria = new FilterCriteria + { + Ruleset = new RulesetInfo { OnlineID = 6 }, + AllowConvertedBeatmaps = true, + SearchText = terms + }; + var carouselItem = new CarouselBeatmap(exampleBeatmapInfo); + carouselItem.Filter(criteria); + ClassicAssert.AreEqual(filtered, carouselItem.Filtered.Value); + } + [Test] [TestCase("", false)] [TestCase("Goes", false)] diff --git a/osu.Game/Screens/Select/FilterCriteria.cs b/osu.Game/Screens/Select/FilterCriteria.cs index 485c4d1d72..1c70132850 100644 --- a/osu.Game/Screens/Select/FilterCriteria.cs +++ b/osu.Game/Screens/Select/FilterCriteria.cs @@ -219,7 +219,7 @@ namespace osu.Game.Screens.Select break; case MatchMode.IsolatedPhrase: - result = Regex.IsMatch(value, $@"(^|\s){Regex.Escape(searchTerm)}($|\s)", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); + result = Regex.IsMatch(value, $@"(^|\b){Regex.Escape(searchTerm)}($|\b)", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); break; case MatchMode.FullPhrase: