【问题标题】:How to split text into paragraphs?如何将文本分成段落?
【发布时间】:2016-04-28 15:56:29
【问题描述】:

我需要将一个字符串拆分为多个段落并计算这些段落(由 2 个或更多空行分隔的段落)。 另外,我需要阅读文本中的每个单词,并且需要能够提及该单词所属的段落。

例如(每个段落多于一行,段落之间有两个空行分隔):

This is
the first
paragraph


This is 
the second
paragraph


This is 
the third
paragraph

【问题讨论】:

  • 显示你尝试过的代码
  • 并添加段落的定义方式...换行?
  • 你可以用 someText.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 分割文本
  • 我不明白为什么这样的问题得到了 3 票,而其他没有发布代码的问题得到了反对票?

标签: c#


【解决方案1】:

这样的东西应该适合你:

        var paragraphMarker = Environment.NewLine + Environment.NewLine;
        var paragraphs = fileText.Split(new[] {paragraphMarker},
                                        StringSplitOptions.RemoveEmptyEntries);
        foreach (var paragraph in paragraphs)
        {
            var words = paragraph.Split(new[] {' '}, 
                                  StringSplitOptions.RemoveEmptyEntries)
                                 .Select(w => w.Trim());
            //do something
        }

您可能需要更改行分隔符,文件可以有不同的变体,例如"\n""\r""\r\n"

您还可以在Trim 函数中传递特定字符以删除'.'',''!''"' 等符号。

编辑:为了增加灵活性,您可以使用正则表达式来分割段落:

        var paragraphs = Regex.Split(fileText, @"(\r\n?|\n){2}")
                              .Where(p => p.Any(char.IsLetterOrDigit));
        foreach (var paragraph in paragraphs)
        {
            var words = paragraph.Split(new[] {' '}, 
                                  StringSplitOptions.RemoveEmptyEntries)
                                 .Select(w => w.Trim());
            //do something
        }

【讨论】:

  • 这一行实际执行的是什么? .Select(w => w.Trim());
  • @CobyAbutbul Trim 从字符串的开头和结尾删除空格字符(还有 TrimStart - 仅从开头,TrimEnd - 仅从结尾)。如果您要删除一些其他符号,例如'.',您可以将它们传递给像Trim(new []{'.',',','?','!'}) 这样的“Trim”,这样它将从字符串的开头和结尾删除所有这些字符。 Select 函数将 Trim 应用于我们从 Split 函数获得的每个字符串。
  • 太棒了。感谢 Andrey Tretyak
  • 据我了解,paragraphs.Length 应该包含我拥有的段落数,但它始终返回 1。
  • @CobyAbutbul 可能是您的文件具有不同的行尾符号。尝试这样的事情:var paragraphs = fileText.Split(new[] {paragraphMarker, "\n\n", "\r\r", "\r\n\r\n"}, StringSplitOptions.RemoveEmptyEntries);。你也可以考虑使用像var paragraphs = Regex.Split(fileText, @"(\r\n?|\n){2}") 这样的正则表达式。如果您可以添加包含两个或更多段落的文本示例,那就太好了。
【解决方案2】:

我认为您想将文本拆分为段落,但是您是否有分隔符告诉您需要拆分字符串?例如,如果您想用“。”标识段落这应该可以解决问题

string paragraphs="My first paragraph. Once upon a time";

string[] words = paragraphs.Split('.');

foreach (string word in words)
{
    Console.WriteLine(word);
}

结果将是:

My first paragraph
Once upon a time

只要记住“。”字符已被删除!。

【讨论】:

  • 听起来像拆分成句子而不是段落的解决方案。 OP 也需要发布定义段落的内容。
【解决方案3】:
    public static List<string> SplitLine(string isstr, int size = 100)
    {
        var words = isstr.Split(new[] { ' ' },
                              StringSplitOptions.RemoveEmptyEntries);
        List<string> lo = new List<string>();
        string tmp = "";

        int i = 0;
        for (i = 0; i < words.Length; i++)
        {
            if ((tmp.Length + words[i].Length) > size)
            {
                lo.Add(tmp);
                tmp = "";
            }
            tmp += " " + words[i];
        }
        if (!String.IsNullOrWhiteSpace(tmp))
        {
            lo.Add(tmp);
        }

        return lo;
    }

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
猜你喜欢
  • 2017-08-28
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多