首页 > 解决方案 > C# 使用 Regex.Split 拆分大字符串。必须保留分隔符

问题描述

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

我有以下正则表达式,它在以下组合“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

Crrently我得到:

 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

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

标签: c#regexsplit

解决方案


您可以使用

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# 演示正则表达式演示

正则表达式是

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

它匹配

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

推荐阅读