Regex.Replace 替换空匹配

Posted

技术标签:

【中文标题】Regex.Replace 替换空匹配【英文标题】:Regex.Replace replaces empty match 【发布时间】:2021-05-28 16:56:37 【问题描述】:

我使用以下正则表达式仅替换非空行(带空格的行不算为空)。

^(.+)$ 带有多行选项。

根据 regex101 这应该可以工作:https://regex101.com/r/S5Fcqw/1

但似乎 C#s 的正则表达式实现有点不同。我可以使用替换来完成这项工作还是需要查看匹配项?

这是电话:Regex.Replace(text, @"^(.+)$", " $1", RegexOptions.Multiline);

语言是 C# 7.2 和 net472 作为目标框架。

所以我现在找到了有问题的组合:

        public static string IndentBy(this string text, int count, string indentationMarker = " ")
        
            if (string.IsNullOrEmpty(text))
            
                return text;
            

            var spaces = string.Join(string.Empty, Enumerable.Repeat(indentationMarker, count));
            var replacement = $"spaces$1";
            var indented = Regex.Replace(text, @"^(.+)$", replacement, RegexOptions.Multiline);
            return indented;
        

        [InlineData("a", "    a")]
        [InlineData("a\nb", "    a\n    b")]
        [InlineData("a\r\nb", "    a\r\n    b")]
        [InlineData("a\n\nb", "    a\n\n    b")]
        [InlineData("a\r\n\r\nb", "    a\r\n\r\n    b")] // this line fails
        public void IndentBy_Input_GivesExpectedOutput(string input, string expected)
        
            // act
            var indentet = IndentBy(input, 4);

            // assert
            indentet.ShouldBe(expected);
        

【问题讨论】:

您的正则表达式不匹配。你能显示minimal reproducible example吗?另外,\r\n != \n 我同意。也许用dotnetfiddle.net 设置一个简短的示例如果您可以在此处写下输入和预期输出也会有所帮助。 我一定错过了什么,因为我在结果中看不到问题。 dotnetfiddle.net/WHXVU7。您能否提供和输入导致问题的原因、您得到的结果以及您想要的结果? @CodeCaster 已修复。当我复制那条线时,我正在玩耍。对此感到抱歉。 @DragandDrop 你没有错过任何东西。它为你工作。让我检查一下我这边还有什么问题。 【参考方案1】:

所以解决方法是不依赖$ 来匹配换行符,而是手动进行。

我现在使用:@"([^\r\n]+\r?\n?)"RegexOptions.SingleLine(不确定是否有必要),它适用于我的用例。

【讨论】:

以上是关于Regex.Replace 替换空匹配的主要内容,如果未能解决你的问题,请参考以下文章

PHP Regex preg_replace 函数仅查找和替换 3 个匹配项中的第一个和最后一个,而不是中间一个

C#Regex使用匹配值替换

python regex replace

用于匹配特殊字符的正则表达式没有空格或换行符

C# 正则表达式 Replace的功能

查找和替换字符串的一部分