РЕДАКТИРОВАТЬ ДЛЯ ЯЗЫКА - Я знаю, что есть способы сделать это несколькими шагами, или используя LINQ или манипуляцию с символами линии С#. Причина, по которой я использую один вызов регулярного выражения, заключается в том, что я хотел практиковать со сложными шаблонами регулярных выражений. - END EDIT
Я пытаюсь написать одно регулярное выражение, которое будет выполнять перенос слов. Он очень близок к желаемому результату, но я не могу заставить его работать.
Regex.Replace(text, @"(?<=^|\G)(.{1,20}(\s|$))", "$1\r\n", RegexOptions.Multiline)
Это правильно обертывание слов для слишком длинных строк, но добавление прерывания строки, когда оно уже есть.
Ввод
"This string is really long. There are a lot of words in it.\r\nHere another line in the string that also very long."
Ожидаемый результат
"This string is \r\nreally long. There \r\nare a lot of words \r\nin it.\r\nHere another line \r\nin the string that \r\nalso very long."
Фактический выход
"This string is \r\nreally long. There \r\nare a lot of words \r\nin it.\r\n\r\nHere another line \r\nin the string that \r\nalso very long.\r\n"
Обратите внимание на двойную "\ r\n" между предложениями, в которых вход уже имел разрыв строки, и добавленный "\ r\n" , который был помещен в конец.
Возможно, существует способ условно применить различные шаблоны замены? И.Е. Если совпадение заканчивается на "\ r\n" , используйте шаблон замены "$ 1", в противном случае используйте шаблон замены "$ 1\r\n".
Здесь ссылка на аналогичный вопрос для обертывания строки без пробела, которую я использовал в качестве отправной точки. Регулярное выражение для поиска несломанного текста и вставки пространства