WinForm(C#)日志数据提取:匹配[[]]内容并通过AMQ上传
提取WinForm文本框中[[...]]内容并通过AMQ上传的解决方案
嘿,我刚好做过类似的WinForm日志处理+AMQ上传的需求,这就给你捋清楚解决方案,分两步走:正则提取内容 + AMQ上传,每一步都给你具体的代码示例。
第一步:用正则提取[[和]]之间的内容
首先要解决的是从文本框内容里精准抓取[[和]]包裹的内容,这里用非贪婪模式的正则表达式是关键,避免把多个[[...]]的内容连在一起匹配。
直接上C#代码:
using System.Text.RegularExpressions; using System.Collections.Generic; // 先拿到文本框里的日志内容 string logText = yourTextBox.Text; // 正则表达式:匹配[[开头、]]结尾的内容,非贪婪模式确保只抓单个包裹块 // RegexOptions.Singleline让.能匹配换行符,应对日志里跨行吗的内容 var regex = new Regex(@"\[\[(.*?)\]\]", RegexOptions.Singleline); var matches = regex.Matches(logText); // 把所有提取到的内容存到列表里 var extractedItems = new List<string>(); foreach (Match match in matches) { // Group[1]就是[[和]]之间的核心内容,记得去掉前后空格 var content = match.Groups[1].Value.Trim(); if (!string.IsNullOrWhiteSpace(content)) { extractedItems.Add(content); } }
正则说明:
\[\[:因为[是正则的特殊字符,所以要转义成\[,两个就是匹配[[(.*?):.*匹配任意字符,?开启非贪婪模式,确保匹配到第一个]]就停止,不会跨多个包裹块\]\]:转义匹配]]RegexOptions.Singleline:让.能匹配换行符,处理日志里可能跨行的包裹内容
第二步:通过AMQ上传提取的内容
假设你用的是主流的RabbitMQ作为AMQ服务(如果是其他AMQ实现,逻辑类似,只是客户端API略有不同),先确保你已经通过NuGet安装了客户端包:
Install-Package RabbitMQ.Client
然后是上传代码,这里给你写了通用的实现,你只需要替换成自己的服务器配置:
using RabbitMQ.Client; using System.Text; // 替换成你的AMQ服务器配置 var amqConfig = new { HostName = "your-amq-server-ip", Port = 5672, // 默认AMQP端口 UserName = "your-username", Password = "your-password", TargetQueue = "your-queue-name" // 要上传到的队列名 }; // 遍历提取到的内容,逐个上传 foreach (var item in extractedItems) { try { // 创建连接工厂 var factory = new ConnectionFactory { HostName = amqConfig.HostName, Port = amqConfig.Port, UserName = amqConfig.UserName, Password = amqConfig.Password }; // 建立连接和通道 using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { // 声明队列(幂等操作,队列已存在也不会报错) channel.QueueDeclare( queue: amqConfig.TargetQueue, durable: false, // 是否持久化,根据需求调整 exclusive: false, autoDelete: false, arguments: null); // 把内容转成字节数组(AMQ传输的是字节流) var body = Encoding.UTF8.GetBytes(item); // 发送消息到队列 channel.BasicPublish( exchange: "", routingKey: amqConfig.TargetQueue, basicProperties: null, body: body); } } catch (System.Exception ex) { // 这里可以加日志或者弹窗提示上传失败的内容 MessageBox.Show($"上传内容「{item}」失败:{ex.Message}", "上传错误"); } }
额外优化建议:
- 复用AMQ连接:如果提取的内容很多,每次循环创建连接会影响性能,可以把
connection和channel放在循环外面(注意WinForm UI线程的线程安全,建议用异步) - 异步处理:WinForm里如果上传大量内容,同步操作会导致UI卡顿,建议把上传逻辑放到异步方法里,比如用
await Task.Run(() => { /* 上传代码 */ }) - 异常捕获:一定要加try-catch,避免单个上传失败导致整个流程中断,同时记录失败的内容方便排查
内容的提问来源于stack exchange,提问作者peter s
相关产品推荐
相关产品推荐

