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

C#正则表达式提取带编号圣经章节节段的方案咨询

符合需求的C#正则表达式解决方案

核心正则表达式

使用以下正则表达式可精准匹配每一节内容,搭配RegexOptions.Singleline选项让.能匹配换行符,确保捕获一节内的所有多行内容:

@"(\d+ .*?)(?=\n\d+|$)"

正则表达式解析

  • \d+:匹配节号的一位或多位数字(如1、2、3)
  • :匹配节号后的空格分隔符
  • .*?:非贪婪模式匹配后续所有内容,直到遇到下一个节的开头或文本结尾
  • (?=\n\d+|$):正向预查断言,界定每一节的结束位置——要么是换行+下一个节号,要么是文本末尾,避免误包含下一节内容

C#代码实现示例

以下是包含匹配分组和换行符替换逻辑的完整代码:

string bibleText = @"1 这是耶稣基督的家谱,他是大卫的子孙,亚伯拉罕的后裔:
2 亚伯拉罕生以撒;
以撒生雅各;
雅各生犹大和他的弟兄;
3 犹大从他玛氏生法勒斯和谢拉;
法勒斯生希斯仑;
希斯仑生兰;";

// 初始化正则,开启Singleline模式让.匹配换行
Regex sectionRegex = new Regex(@"(\d+ .*?)(?=\n\d+|$)", RegexOptions.Singleline);
MatchCollection sections = sectionRegex.Matches(bibleText);

int groupIndex = 1;
foreach (Match sectionMatch in sections)
{
    string rawSection = sectionMatch.Groups[1].Value;
    // 替换所有换行符为空格
    string formattedSection = rawSection.Replace(Environment.NewLine, " ").Replace("\n", " ").Replace("\r", "");
    
    Console.WriteLine($"分组#{groupIndex}:");
    Console.WriteLine(formattedSection);
    groupIndex++;
}

原正则失效原因

你之前使用的@"([^0-9][\s\S^0-9]*[^0-9])"存在两个关键问题:

  1. 开头的[^0-9]直接排除了节号数字,导致匹配结果丢失每节的开头编号
  2. 边界处理错误,未正确识别下一节的起始标识,导致分组数量和内容均不符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:13:20