From e1b64fb63db00e756073862ff2d7d1ee8929a8c4 Mon Sep 17 00:00:00 2001 From: Dan Moseley Date: Thu, 25 Jul 2019 22:27:18 -0700 Subject: [PATCH] Fix NRE when MatchEvaluator returns null (dotnet/corefx#39779) * Fix NRE when MatchEvaluator returns null * Update Regex.Replace.Tests.cs * Use fancy syntax Commit migrated from https://github.com/dotnet/corefx/commit/98227597b152076cb02c55bb695c572c14284e32 --- .../System/Text/RegularExpressions/Regex.Replace.cs | 2 +- .../tests/Regex.Replace.Tests.cs | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.Replace.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.Replace.cs index 22e5f3f..cb78992 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.Replace.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.Replace.cs @@ -186,7 +186,7 @@ namespace System.Text.RegularExpressions vsb.Append(input.AsSpan(prevat, match.Index - prevat)); prevat = match.Index + match.Length; - vsb.Append(evaluator(match)); + vsb.Append(evaluator(match) ?? ""); if (--count == 0) break; diff --git a/src/libraries/System.Text.RegularExpressions/tests/Regex.Replace.Tests.cs b/src/libraries/System.Text.RegularExpressions/tests/Regex.Replace.Tests.cs index 0cbf545..5bcfa77 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/Regex.Replace.Tests.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/Regex.Replace.Tests.cs @@ -224,6 +224,25 @@ namespace System.Text.RegularExpressions.Tests Assert.Same(input, Regex.Replace(input, "no-match", new MatchEvaluator(MatchEvaluator1))); } + [Theory] + [InlineData(RegexOptions.None)] + [InlineData(RegexOptions.RightToLeft)] + public void Replace_MatchEvaluatorReturnsNullOrEmpty(RegexOptions options) + { + string result = Regex.Replace("abcde", @"[abcd]", (Match match) => { + return match.Value switch + { + "a" => "x", + "b" => null, + "c" => "", + "d" => "y", + _ => throw new InvalidOperationException() + }; + }, options); + + Assert.Equal("xye", result); + } + [Fact] public void Replace_Invalid() { -- 2.7.4