#c_sharp #split
У меня есть длинная строка, в которой есть переходы на новую строку, вопросительные, восклицательные знаки, точки. Мне нужно получить массив строк, которые будут делиться по правилу, 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! Всем большое спасибо! Все ответы рабочие:)
Ответы
Ответ 1
Сначала подготавливаем текст, добавляя в знаки !?. \n. var prepair = myText.Replace(".",".\n").Replace("!","!\n").Replace("?","?\n"); String[] lines = prepair.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);Ответ 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 | - "или", т.е. разделитель удовлетворяет или одному шаблону, или другому * - и любое число пробелов, они будут принадлежать разделителю и в результат не попадут
Комментариев нет:
Отправить комментарий