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])"存在两个关键问题:
- 开头的
[^0-9]直接排除了节号数字,导致匹配结果丢失每节的开头编号 - 边界处理错误,未正确识别下一节的起始标识,导致分组数量和内容均不符合预期
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

