Помощь с Split С#

228
19 января 2018, 21:42

Здравствуйте. У меня есть длинная строка, в которой есть переходы на новую строку, вопросительные, восклицательные знаки, точки. Мне нужно получить массив строк, которые будут делиться по правилу,

String[] lines = myText.Split(new char[] { '\r', '\n', '.', '!', '?' }, StringSplitOptions.RemoveEmptyEntries);

Такое решение делит всё верно, но проблема в том, что оно удаляет знаки препинания. Я хотел бы оставлять '.', '!', '?' вот эти знаки и удалять переходы на новую строку \r, \n. Пример:

Lorem ipsum, dolor sit amet, elit. Nullam! Faucibus congue?
Phasellus molestie, orci
Ut aliquam nulla tristique nec?
Nec bibendum tortor sodales!

Результат

1-Lorem ipsum, dolor sit amet, elit.
2-Nullam!
3-Faucibus congue?
4-Phasellus molestie, orci
5-Ut aliquam nulla tristique nec?
6-Nec bibendum tortor sodales!

Всем большое спасибо! Не ожидал, что столько откликнется помочь. Все ответы рабочие:)

Answer 1

Сначала подготавливаем текст, добавляя в знаки !?. \n.

var prepair = myText.Replace(".",".\n").Replace("!","!\n").Replace("?","?\n");
String[] lines = prepair.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
Answer 2

Давайте разделим текст с помощью регулярки:

string text = "Lorem ipsum, dolor sit amet, elit. Nullam! Faucibus congue?\r\nPhasellus molestie, orci\r\nUt aliquam nulla tristique nec?\r\nNec bibendum tortor sodales!";
string pattern = @"((?<=[.?!])|\r?\n) *";
foreach (string s in Regex.Split(text, pattern).Where(s => !string.IsNullOrWhiteSpace(s)))
    Console.WriteLine(s);

Правда, придется удалить пустые строки вручную (я делаю это с помощью Where), так как в Regex.Split() нету аналога StringSplitOptions.RemoveEmptyEntries

Здесь паттерн описывает формат разделителя:

(?<=[.?!]) - положительный просмотр назад, т.е. ищем один из символов . или ? или !, но они сами в разделитель не входят, они войдут в часть перед разделителем

\r?\n - перевод строки, поддерживает варианты как \r\n, так и просто \n

| - "или", т.е. разделитель удовлетворяет или одному шаблону, или другому

* - и любое число пробелов, они будут принадлежать разделителю и в результат не попадут

READ ALSO
c#. System.Windows.Forms.WebBrowser и код текста для IFrame

c#. System.Windows.Forms.WebBrowser и код текста для IFrame

Использую стандартный SystemWindows

380
Недоступны элементы для создания формы

Недоступны элементы для создания формы

Почему не могу использовать стандартные элементы в visual studio? Подскажите как решить данную проблему пожалуйста

250
как сделать натуральную сортировку в datagrid

как сделать натуральную сортировку в datagrid

VS2010 как сделать натуральную сортировку в datagrid согласно примеру в msdnСортировка работает, но цифры сортирует как символы

279
Свойство DialogResult у кнопки

Свойство DialogResult у кнопки

Проблема кажется детской, но я почему-то(тупой) не могу до конца разобратьсяНеобходимо на форме поставить у кнопок свойства DialogResult как "OK" и "Cancel"

268