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
相关产品推荐
相关产品推荐

