c# - .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"
解决方案
如果您只想显示最多两个换行符,请仅将大于两个的内容替换为前两个。这将保留它是换行还是回车或两者兼而有之。
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");
推荐阅读
- javascript - 如何从非字符串格式的 EJS 方法返回 Html
- flutter - 颤振构建apk中的错误
- sql - 仅限用户使用的 Oracle 会话参数
- android - 如何过滤与android room db的一对多关系
- ios - 更新 root.plist 中的值
- flutter - 我想单击文档图片并对其进行裁剪(如 cam 扫描仪),这将在用户单击我的 sliverList 时完成。我是新来的颤振
- reactjs - 在功能组件 ReactJS 上更新数组
- jekyll - 将 Markdown 导出到 GitHub Pages 时处理内部 git-repository 链接
- docker - Visual Studio docker-compose 正在覆盖容器 COMMAND
- google-analytics - 增强型电子商务列表归因不适用于 Measurement Protocol HTTP 请求