Страницы

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

четверг, 2 января 2020 г.

Взять из строки слова которые начинаются с большой буквы

#c_sharp #linq


Есть текст, из которого надо взять слова начинающиеся с большой буквы.

решИла нЕ Упрощать и зашифРОВАтЬ Все послаНИЕ
дАже не Старайся нИЧЕГО у тЕбя нЕ получится с расшифРОВкой
Сдавайся НЕ твоего ума Ты не споСОбЕн Но может быть
если особенно упорно подойдешь к делу

будет Трудно конечнО
Код ведЬ не из простых
очень ХОРОШИЙ код
то у тебя все получится
и я буДу Писать тЕбЕ еще

чао


мой код

data.Split(' ').Select(x => x).Where(x=>char.IsUpper(x[0])).Reverse().ToList();


Почему то он не берет все слова которые начинаются с большой буквы. Мой результат

Писать ХОРОШИЙ Трудно Но Ты НЕ Старайся Все Упрощать


А должно получиться

Писать ХОРОШИЙ Код Трудно Но Ты НЕ Сдавайся Старайся Все Упрощать


Что в моем коде не так*
    


Ответы

Ответ 1



Думаю, проблема в том, что вы делите по пробелу, а нужно включить в разделяющие символы ещё и конец строки (и Tab, наверное). Ещё одна потенциальная проблема: Вы берёте первый символ слова, не проверив длину слова. Ну и конструкция Select(x => x) не изменяет последовательность и таким образом не нужна.

Ответ 2



Можно решить проблему поиска разделителей, табов, переносов строк и прочих запятых через регулярные выражения: string pattern = @"\b\p{Lu}.*?\b"; var words = Regex.Matches(data, pattern) .Cast().Select(m => m.Value).Reverse(); Console.WriteLine(String.Join(" ", words)); \b - граница слова \p{Lu} - большая буква .*? - любые символы, но как можно меньше (т.е. очередное \b совпадет с ближайшей границей слова)

Ответ 3



data.Split(' ', '\n') .Where(x => !string.IsNullOrEmpty(x)) .Where(x => char.IsUpper(x[0])) .Reverse(); Добавил в разделители перенос строки и проверку на то, что строка не пустая, как советовал VladD, теперь работает правильно.

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

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