首页 > 解决方案 > Regex.Replace 替换空匹配

问题描述

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

^(.+)$使用多行选项。

根据 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);
        }

标签: c#regexp-replace

解决方案


因此,解决方法是不依赖于$匹配换行符,而是手动进行。

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


推荐阅读