使用C#将长文本拆分为具有一定长度的有意义的句子

时间:2011-04-06 02:00:02

标签: c#-4.0

我想将一个文本拆分为一个点,然后是一个空格或一个点,后面跟一个新行(\ n)一定长度。

例如,如果我有长文本,总共有356个字符。我想把这个文本分成三个差异。 1000或最接近的文字。字符,但每个文本应以完整有意义的句子结束。

我想这样做的原因是,我使用的API只需要1000或更少的char进行数据转换,但我有一些长度超过1000个字符的文本,所以我想分成多个文本,所以我没有任何文本超过1000个字符,每个文本以完整的形式结束。例如,文本到一个点后跟一个空格或一个点后跟一个新行(\ n)

我正在使用c#.Net

先谢谢。

1 个答案:

答案 0 :(得分:0)

像这样的东西。显然,将“someText”替换为您的数据,并将shardLength设置为1000作为示例。如果句子大于块大小,则此解决方案会出错。

它目前通过有效地忽略它们来处理换行符 - 它只会拆分“。”

这意味着以“。”结尾的句子将在“。”后分割,“\ n”将在下一句的开头。

这里的优点是,如果您将其传递给API,您应该能够连接结果并将新行保留在适当的位置(假设API处理换行符)。

     using System.Text.RegularExpressions;
     public static void BlockSplitter()
        {
            String someText = @"This is some text.
The quick brown fox jumps over the lazy dog. Testing 1 2 3.
Sentence with no fullstop";
            String[] sentences;

            string delimiters = @"(?<=\.)";

            sentences = Regex.Split(someText,delimiters);

            String shard = String.Empty;
            int shardLength = 45;

            foreach (String sentence in sentences)
            {
                if (sentence.Length > shardLength) 
                {
                    //Raise an exception as the sentence 
                }
                if ((shard.Length + sentence.Length) <= shardLength)
                {
                    shard += sentence;
                }
                else
                {
                    Console.WriteLine(shard);
                    shard = sentence;
                }
            }
            Console.WriteLine(shard);
        }