You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}", "上传错误");
    }
}

额外优化建议:

  1. 复用AMQ连接:如果提取的内容很多,每次循环创建连接会影响性能,可以把connection和channel放在循环外面(注意WinForm UI线程的线程安全,建议用异步)
  2. 异步处理:WinForm里如果上传大量内容,同步操作会导致UI卡顿,建议把上传逻辑放到异步方法里,比如用await Task.Run(() => { /* 上传代码 */ })
  3. 异常捕获:一定要加try-catch,避免单个上传失败导致整个流程中断,同时记录失败的内容方便排查

内容的提问来源于stack exchange,提问作者peter s

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:59:50