根据段落和句子的“/n”和“.”将文本从 string/file 拆分为 two-dimensional 数组。

Split text from a string/file into a two-dimensional array based on "/n" and ". " for paragraphs and sentences.

我需要从文档或字符串(来自用户粘贴的文本)中获取文本,并将其拆分为二维数组,其中每个部分是一个段落,其中的值是句子。如果有任何影响,我将以 winform 的形式执行此操作。

到目前为止我已经有了它,所以我可以制作一个基本数组来保存每个段落的文本,以“\n”区分(这确实会导致 headers 之类的东西独立存在,但这很好).但我还需要用“。”分隔每个句子,并形成上述 two-dimensional 数组。

我目前的代码是:

public void sentenceSplit()
    {
        content = File.ReadAllText(documentPath);
        content = Regex.Replace(content, @"^\s+$[\r\n]*", "", RegexOptions.Multiline);
        string[] paragraphs = content.Split('\n');            

        TextboxSummary.Text = string.Join("\n \n", paragraphs);
    }

正则表达式是必需的,因为它会删除完全空行,否则由于双“\n”的情况,这些空行将作为数组条目添加。

我以前没有处理过创建这样的二维数组,我不确定它是否可以在一行中完成,我只声明 2 个拆分值而不是 1 个。

您可能需要一个锯齿状数组,因为每个段落中的句子数量可能不同。锯齿状数组可以被认为是数组的数组,并且与 C# 中的普通多维数组具有不同的语法。 MSDN for Jagged Arrays

以下是我将如何使用锯齿状数组来解决您的问题。

content = File.ReadAllText(documentPath);
var paragraphs = content.split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);

string[][] results = new string[paragraphs.Length][];

for(int i = 0; i < results.Length; i++)
{
    results[i] = paragraphs[i].Split(new char[] {'.'}, StringSplitOptions.RemoveEmptyEntries);
}

您可以通过使用 StringSplitOptions.RemoveEmptyEntries 配置选项避免使用正则表达式,因为它会删除所有仅包含空格的字符串,包括 \n 个字符串。

现在,访问 results[0] 将为您提供第一段中所有字符串的数组,依此类推。

一些注意事项。 None 的句子将不再有句号,但您可以很容易地将它们添加回去。如果一个句号出现在句子中间,比如以十进制数表示,这些将被视为单独的句子。我敢肯定,比我拥有更多 Regex 知识的人可以为您提供一个拆分正则表达式,它可以更好地找到句子的结尾。