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

C#中基于Regex Split实现按QId分割文本并生成字典

提取带QId标识的问题生成字典的解决方案

你有一段包含多个问题的文本,每个问题以QId {QuestionId}作为分隔标识,想要生成一个以整数类型的QuestionId为键、问题内容为值的字典,但之前用Regex.Split只能提取出问题内容,没法把ID和内容对应起来。

解决思路

Regex.Split仅能分割文本,无法捕获分割标识里的ID信息,所以应该改用Regex.Matches来匹配每个QId标识及其对应的问题内容,通过正则分组分别提取ID和内容,再组装成字典。

实现代码

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        // 示例输入文本
        string text = @"QId 1 这是第一个问题的内容
QId 2 这是第二个问题,可能包含换行
的内容
QId 3 第三个问题";

        // 正则表达式:分组捕获QId后的数字,以及对应的问题内容
        var regex = new Regex(@"\s*QId\s*(\d+)\s*(.*?)(?=\s*QId\s*\d+|$)", RegexOptions.Singleline);
        var matches = regex.Matches(text);

        Dictionary<int, string> questionDict = new Dictionary<int, string>();

        foreach (Match match in matches)
        {
            // 尝试将捕获的ID转为整数
            if (int.TryParse(match.Groups[1].Value, out int qId))
            {
                // 提取并清理问题内容
                string content = match.Groups[2].Value.Trim();
                questionDict[qId] = content;
            }
        }

        // 输出测试结果
        foreach (var kvp in questionDict)
        {
            Console.WriteLine($"QId {kvp.Key}: {kvp.Value}");
        }
    }
}

代码说明

  • 正则表达式\s*QId\s*(\d+)\s*(.*?)(?=\s*QId\s*\d+|$):
    • (\d+):捕获QId后的数字,作为字典的键
    • (.*?):非贪婪匹配问题内容,避免把后续的问题内容也包含进来
    • (?=\s*QId\s*\d+|$):正向预查,匹配到下一个QId标识或者文本结尾时停止
  • RegexOptions.Singleline:让.可以匹配换行符,支持处理多行的问题内容
  • int.TryParse:确保捕获的ID能正确转为整数,避免无效格式的ID导致报错

内容的提问来源于stack exchange,提问作者Vijendra Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:55:23