Разбить большую текстовую строку на строки переменной длины, не разбивая слова и сохраняя переносы и пробелы - PullRequest
2 голосов
/ 12 мая 2010

Я пытаюсь разбить большую строку текста на несколько строк меньшего размера и определить максимальную длину каждой строки меньшего размера. например:

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

Я хотел бы иметь код, который может разбить его на более мелкие строки, и в первой строке должно быть не более 5 символов, во второй строке - не более 11, а в остальных - не более 20, что приводит к следующему:

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 ]

1 голос
/ 12 мая 2010
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, но я не помню, как его использовать.

0 голосов
/ 12 мая 2010
\A(.{0,5}\b)(.{0,11}\b)(.{0,20}\b)+\Z

будет захватывать до пяти символов в группе 1, до 11 в группе 2 и фрагменты до 20 в группе 3. Совпадения будут разделяться по разделителям слов во избежание разделения в середине слова. Пробелы, разрывы строк и т. Д. Считаются символами и будут сохранены.

Хитрость в том, чтобы найти отдельные совпадения в повторяющейся группе, что можно сделать только в .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 и кода VB здесь , поэтому, пожалуйста, не стесняйтесь указывать на мои ошибки кодирования.

Обратите внимание, что пробел в начале второй строки записывается в конце предыдущего матча.

...