如何在C#中将虚线分隔的日志文本分割为字符串数组?
解决日志按任意长度虚线分割的问题
你的原代码存在核心问题:用字符数组{ '-','-','-','-','-','-' }分割时,会把**单个'-'**作为分割依据,不仅会误拆分日志内容里的'-'(比如AUDIT -中的连接符),还无法匹配日志中长短不一的虚线分隔线(示例里的分隔线长度分别是25、29个'-')。
下面是两种可行的解决方案:
方案一:正则直接分割连续虚线
利用正则表达式匹配4个及以上连续的'-'(确保不会误匹配日志里的单个/少数'-'),同时自动处理分隔线前后的换行和空白:
using System.Text.RegularExpressions; using System.Linq; // 读取日志内容 string textFromFile = _streamReader.ReadToEnd(); // 分割并过滤无效空元素 string[] paragraphs = Regex.Split(textFromFile, @"\s*-{4,}\s*") .Where(paragraph => !string.IsNullOrWhiteSpace(paragraph)) .ToArray();
代码说明:
\s*-{4,}\s*:\s*匹配分隔线前后的任意空白/换行,-{4,}匹配至少4个连续的'-';Where(...):过滤分割后产生的空字符串或全空白字符串。
方案二:统一分隔符后再分割
先将所有长短不一的虚线替换为统一的自定义分隔符,再进行分割,适合需要更直观控制分隔逻辑的场景:
using System.Text.RegularExpressions; string textFromFile = _streamReader.ReadToEnd(); // 将所有连续4个及以上的'-'替换为统一分隔符 string normalizedLog = Regex.Replace(textFromFile, @"-{4,}", "###LOG_SEPARATOR###"); // 分割并修剪每个段落的前后空白 string[] paragraphs = normalizedLog.Split( new string[] { "###LOG_SEPARATOR###" }, StringSplitOptions.RemoveEmptyEntries) .Select(paragraph => paragraph.Trim()) .ToArray();
代码说明:
Regex.Replace(...):统一所有虚线分隔符,避免因长度不同导致分割失败;Select(paragraph => paragraph.Trim()):移除每个段落前后的多余换行和空白,让内容更整洁。
两种方案处理示例日志后,都会得到3个元素的数组:
paragraphs[0]:8/23 17:40:54:761 6948 - AUDIT - Logging: Set ABCparagraphs[1]:08/23 17:40:54:772 6948 - TRANSACTION - Logging: FullFileName:/XYZ/ Message:Some Message Type : Informationparagraphs[2]:08/23 17:40:54:844 6948 - INFO - Logging: End of Control_Loaded
内容的提问来源于stack exchange,提问作者DotNetSpartan
相关产品推荐
相关产品推荐

