.NET日志解析:将非"2018开头行合并至前一行的正则实现
处理.NET日志:合并不以
"2018开头的行 嘿,刚好之前处理过类似的日志清理需求,给你分享下在.NET里的具体实现方式!
核心思路
我们要做的就是:找到所有换行符后紧跟非"2018开头的内容,把这个换行符去掉,让下一行直接拼接到上一行末尾。既可以用正则替换直接完成合并,也可以用Match定位所有违规行。
方式一:正则替换直接合并行(高效首选)
这种方式不需要逐行遍历,一次性处理整个日志内容,适合文件体积不大的场景:
using System.IO; using System.Text.RegularExpressions; // 读取原始日志文件内容 string rawLog = File.ReadAllText("path/to/your/logfile.log"); // 执行正则替换:移除所有"连接非合规行"的换行符 string cleanedLog = Regex.Replace( input: rawLog, pattern: @"\r?\n(?!""2018)", replacement: "", options: RegexOptions.None ); // 写入清理后的日志到新文件 File.WriteAllText("path/to/cleaned_logfile.log", cleanedLog);
正则表达式拆解
\r?\n:兼容Windows(\r\n)和Linux/macOS(\n)的换行格式,避免因系统差异漏处理(?!""2018):负向前瞻断言——确保换行符后面的内容不是以"2018开头,这样我们只移除那些连接违规行的换行符- 替换为空字符串,就相当于把违规行直接追加到上一行的末尾
方式二:用Match定位所有违规行
如果需要先排查、统计这些不合规的行,再处理,可以用Regex.Matches配合多行模式:
using System.Text.RegularExpressions; // 读取原始日志内容(或从流中读取) string rawLog = File.ReadAllText("path/to/your/logfile.log"); // 匹配所有不以`"2018`开头的行 MatchCollection invalidLines = Regex.Matches( input: rawLog, pattern: @"^((?!""2018).)*$", options: RegexOptions.Multiline ); // 遍历输出违规行信息 foreach (Match line in invalidLines) { Console.WriteLine($"发现违规行(起始索引:{line.Index}):{line.Value}"); }
这里的正则说明
- 开启
RegexOptions.Multiline后,^和$会匹配每一行的开头和结尾(而不是整个字符串的首尾) (?!""2018):负向前瞻,排除以"2018开头的行((?!""2018).)*:匹配整行内容,只要该行不符合开头要求
注意事项
- 转义细节:在.NET的逐字字符串(
@开头)中,双引号需要用两个双引号("")转义;如果不用逐字字符串,就要写成\"2018 - 大文件适配:如果日志文件特别大,建议用
StreamReader逐行读取处理,避免一次性加载整个文件到内存 - 你提到在regex101里测试正则有效,只要把regex101里的
\"2018转换成.NET里的""2018(逐字字符串)或者\"2018(普通字符串),就能正常工作
内容的提问来源于stack exchange,提问作者justSteve
相关产品推荐
相关产品推荐

