C# 使用 Regex.Split 拆分大字符串。必须保留分隔符

Posted

技术标签:

【中文标题】C# 使用 Regex.Split 拆分大字符串。必须保留分隔符【英文标题】:C# split large string with Regex.Split. Must keep delimiters 【发布时间】:2021-03-02 04:07:34 【问题描述】:

我正在尝试使用正则表达式将一堵文本墙拆分为一个数组,它运行良好,但我不希望它删除我正在使用的分隔符。我研究了前瞻功能,但我无法让它正常工作或根本无法工作。

我有以下正则表达式,它在以下组合“Artículo #.”、“Artículo ##.”、1)、2) 等和 a)、b)、c) 以及“Párrafo”一词处拆分。

var result = Regex.Split(text, @"(Artículo)\s[0-9](.)|(Artículo)\s[0-9][0-9](.)|[a-z](\))|[1-9](\))|[1-9][0-9](\))|(Párrafo)", RegexOptions.None);

我需要保留我用来拆分的关键字。例如我有以下文字

Artículo 1. This is a test that includes : 1) Sample text 2) Sample text

最近我得到了:

 This is a test that includes :
 Sample text
 Sample text

我需要什么:

Artículo 1. This is a test that includes :
1) Sample text
2) Sample text

我觉得我快要接近了,但任何帮助都会很棒。

【问题讨论】:

除了拆分之外,您还可以使用Regex.Match捕获组。这样您就可以遍历匹配项,并查看使用了哪个分隔符 【参考方案1】:

你可以使用

var text = "Artículo 1. This is a test that includes : 1) Sample text 2) Sample text";
var result = Regex.Split(text, @"(?!^)\s+(?=\bArtículo\s+[0-9]+\.|[a-z]\)|[1-9]\d?\)|\bPárrafo\b)", RegexOptions.None);
Console.WriteLine(string.Join("\n", result));
// => Artículo 1. This is a test that includes :
// => 1) Sample text
// => 2) Sample text

请参阅C# demo 和regex demo。

正则表达式是

(?!^)\s+(?=\bArtículo\s+[0-9]+\.|[a-z]\)|[1-9]\d?\)|\bPárrafo\b)

匹配

(?!^) - 字符串开头以外的位置 \s+ - 1+ 个空格(如果您使用\s*,则需要在Regex.Split 调用之后添加.Where(x => !string.IsNullOrEmpty(x))(?=\bArtículo\s+[0-9]+\.|[a-z]\)|[1-9]\d?\)|\bPárrafo\b) - 紧随其后的位置 \bArtículo\s+[0-9]+\.| - 整个单词 Artículo、1+ 个空格、1+ 个 ASCII 数字和一个 .,或 [a-z]\)| - 小写 ASCII 字母和 ),或 [1-9]\d?\)| - 一个非零数字,然后是一个可选数字和一个),或者 \bPárrafo\b - 一个完整的词Párrafo

【讨论】:

感谢您的精彩解释和代码。效果很好!

以上是关于C# 使用 Regex.Split 拆分大字符串。必须保留分隔符的主要内容,如果未能解决你的问题,请参考以下文章

Java string.split 与 C# Regex.split - 限制为一定数量的字段

C# 正则表达式匹配与拆分相同的字符串

如何保留 Regex.Split 的分隔符?

正则表达式 .net 拆分

如何将分隔符数组传递给 Regex.Split 函数? [关闭]

设置对象数组中每个项目的属性(C#,Regex.Split())