将大文本字符串拆分为可变长度字符串,而不会破坏单词并保留换行符和空格

时间:2010-05-11 22:58:42

标签: c# string split words

我试图将一大串文本分成几个较小的文本字符串,并将每个较小的文本字符串最大长度定义为不同。例如:

"The quick brown fox jumped over the red fence.
       The blue dog dug under the fence."

我想要的代码可以将其拆分为更小的行,并且第一行最多包含5个字符,第二行的最大值为11,其余的最大值为20,结果如下: / p>

Line 1: The 
Line 2: quick brown
Line 3: fox jumped over the 
Line 4: red fence.
Line 5:        The blue dog 
Line 6: dug under the fence.

这一切都在C#或MSSQL中,有可能吗?

2 个答案:

答案 0 :(得分:1)

public List<String> SplitString(String text, int [] lengths)
{
   List<String> output = new List<String>();

   List<String> words = Split(text);

   int i = 0;
   int lineNum = 0;
   string s = string.empty;
   while(i<words.Length)
   {
       if(s.Length+words[i].Length <lengths[lineNum])
       {
            s+=words[i];
            i++;
            if(lineNum<lengths.Length-1)
                 lineNum++;
       }
       else
       {
          output.Add(s);
          s=String.Empty;
       }

   }

    s.Remove(S.length-1,1);// deletes last extra space.

    return output;
}


   public static List<string> Split(string text)
    {
        List<string> result = new List<string>();
        StringBuilder sb = new StringBuilder();

        foreach (var letter in text)
        {
            if (letter != ' ' && letter != '\t' && letter != '\n')
            {
                sb.Append(letter);
            }
            else
            {
                if (sb.Length > 0)
                {

                    result.Add(sb.ToString());
                }

                result.Add(letter.ToString());
                sb = new StringBuilder();
            }
        }

        return result;
    }

这是未经测试/编译的代码,但您应该明白这一点。

我也认为你应该使用StringBuilder,但我不记得如何使用它。

答案 1 :(得分:0)

\A(.{0,5}\b)(.{0,11}\b)(.{0,20}\b)+\Z

将在组1中捕获最多五个字符,在组2中最多捕获11个字符,在组3中捕获最多20个字符。匹配将沿着字分隔符分割,以避免在单词的中间分割。空格,换行符等计为字符并将被保留。

诀窍是获得重复组中的单个匹配,这只能在.NET和Perl 6中完成:

Match matchResults = null;
Regex paragraphs = new Regex(@"\A(.{0,5}\b)(.{0,11}\b)(.{0,20}\b)+\Z", RegexOptions.Singleline);
matchResults = paragraphs.Match(subjectString);
if (matchResults.Success) {
    String line1 = matchResults.Groups[1].Value;
    String line2 = matchResults.Groups[2].Value;
    Capture line3andup = matchResults.Groups[3].Captures;
    // you now need to iterate over line3andup, extracting the lines.
} else {
    // Match attempt failed
} 

我根本不知道C#,并试图从RegexBuddy的模板和the VB code here构建它,所以请随意指出我的编码错误。

请注意,第二行开头的空格会在上一场比赛结束时被捕获。