Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

Помощь с Split С#

#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 | - "или", т.е. разделитель удовлетворяет или одному шаблону, или другому * - и любое число пробелов, они будут принадлежать разделителю и в результат не попадут

Комментариев нет:

Отправить комментарий