首页 > 解决方案 > .net 核心限制 \r\n 到两行

问题描述

我得到一串原始数据,我不想允许超过 2 个新行,我无法控制源但是我只想显示当前行的结尾,以及任何情况下的一个间隙线,我可以'没有找到一个很好的解决方案。

以下是数据示例:

"content": "Ldfjljildjbfd\r\n\r\nEihile\r\n\r\n\r\n\r\n\r\n\r\nErlgheiorjgoierjhg\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\neighi\r\n"

以下是它当前在屏幕上的外观示例:

This is my example






It doesn't look particularly appealing

这是一个我希望它看起来如何的示例:

This is my example

Much better here...

我试图以最肮脏的方式做到这一点,使用这样的东西:

    private string DirtyLineClean(string body)
    {
        string body1 = body.Replace(@"\r\n\r\n\r\n\r\n\r\n\r\n", "\r\n\r\n");
        string body2 = body1.Replace(@"\r\n\r\n\r\n\r\n\r\n", "\r\n\r\n");
        string body3 = body2.Replace(@"\r\n\r\n\r\n\r\n", "\r\n\r\n");
        string body4 = body3.Replace(@"\r\n\r\n\r\n", "\r\n\r\n");

        return body4;
    }

不幸的是,这根本不起作用。

欢迎任何建议。

更新

使用 LarsTech 的答案,有些东西不太奏效。这是我的输入:

Ldjgehgoierg\r\n\r\nErg\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nGergege\r\n\r\n\r\n\r\nErgerg\r\n\r\nEg\r\n\r\nEr\r\n\r\nGer\r\n\r\n\r\n\r\n\r\n\r\nrgg\r\n

这是输出:

Ldjgehgoierg\r\n\n\r\n\nErg\r\n\n\r\n\n\r\n\n\r\n\n\r\n\n\r\n\n\r\n\n\r\n\nGergege\r\n\n\r\n\n\r\n\n\r\n\nErgerg\r\n\n\r\n\nEg\r\n\n\r\n\nEr\r\n\n\r\n\nGer\r\n\n\r\n\n\r\n\n\r\n\n\r\n\n\r\n\nrgg\r"

标签: c#.net.net-core

解决方案


如果您只想显示最多两个换行符,请仅将大于两个的内容替换为前两个。这将保留它是换行还是回车或两者兼而有之。

using System.Text.RegularExpressions;

var result = Regex.Replace(source, "((?:\r\n?|\n){2})[\r\n]+", "$1");

此正则表达式将首先尝试使用“完整”回车+换行序列,否则它将匹配各个组件。例如,这会将序列\r\n\n视为2而不是3。类似地,以下内容将在序列 的开头全部消耗: \n\r\n\r\n\r\n\r\r\n\n\n和(仅当下一个值不是后两个值时\n\r,它们会贪婪地匹配其他值之一)。之后它只匹配任何序列,因为我们无论如何都打算丢弃它们。\r\r\n

替换文本"$1"指示整个匹配项(三个或更多回车/换行)应替换为第一个捕获组的内容前两个,逐字)。

正则表达式风暴示例

如果您想用当前平台的换行符替换,这应该有效:

var result = Regex.Replace(source, "(?:(?:\r\n?|\n){2})[\r\n]+", Environment.NewLine + Environment.NewLine);

在这种情况下,我将第一组设为非捕获 ( ?:),因为我们不再需要保留内容。这是一个潜在的、次要的优化。

注意:正则表达式确实有一些开销。如果您要经常这样做,将正则表达式与RegexOptions.Compiled标志一起存储在静态字段中可能是合适的:

private static readonly Regex NewLineRegex = new Regex("((?:\r\n?|\n){2})[\r\n]+", RegexOptions.Compiled);

var result = NewLineRegex.Replace(source, "$1");

推荐阅读