C# (.NET): Замена первой буквы предложения со строчной на прописную

Искал в интернете готовое решение, но с удивлением обнаружил, что ни в рунете, ни в англоязычном интернете его не оказалось. Впрочем, вполне может быть, что просто не нашёл.

Чтобы сделать заглавные буквы в каждом слове, существует встроенная функция ToUpper(). Но с помощью регулярных выражений мы можем точечно и адресно назначать эту замену:

var replace_up = new Regex((@"(^|\n|(^|\n)(—|-)\s|(\.|!|\?)\s)([A-Z]|[А-Я])"), RegexOptions.IgnoreCase);
mytext = replace_up.Replace(mytext, m=>m.ToString().ToUpper());

Как видите, при содействии regexp замена задана только в особых случаях:
  • ^ – в самом начале текста;
  • \n – в начале каждого абзаца;
  • (^|\n)(—|-)\s – через пробел в самом начале текста или в начале абзаца после тире или дефиса (если диалог);
  • (\.|!|\?)\s) – через пробел после точки, а также вопросительного и восклицательного знаков;

Таким образом, поставленная задача была успешно выполнена. Конечно, код можно немного сократить и поправить, но всё работает и так.

Разумеется, как и многие регулярки, этот код можно быстро и легко из C# (.NET) портировать на другие языки.

Итак, например, такой текст:
старый солдат шёл на побывку. притомился в пути, есть хочется. дошёл до деревни, постучал в крайнюю избу:
- пустите отдохнуть дорожного человека! дверь отворила старуха.
- заходи, служивый.
- а нет ли у тебя, хозяюшка, перекусить чего? у старухи всего вдоволь, а солдата поскупилась накормить, прикинулась сиротой.
аккуратно меняется на
Старый солдат шёл на побывку. Притомился в пути, есть хочется. Дошёл до деревни, постучал в крайнюю избу:
- Пустите отдохнуть дорожного человека! Дверь отворила старуха.
- Заходи, служивый.
- А нет ли у тебя, хозяюшка, перекусить чего? У старухи всего вдоволь, а солдата поскупилась накормить, прикинулась сиротой.

Похожие темы


Lind@
Интересный вариант.

NatalyaB
через пробел после точки, а также вопросительного и восклицательного знаков;
Отлично, но стоит добавить многоточие. И еще с кавычками как-то разобраться.

Шеф
многоточие. И еще с кавычками
Благодарю за дополнение!
Обновил код:
var replace_up = new Regex((@"(^|\n|(^|\n)(—|-)\s|(\.|!|\?|...)\s|(«|""))([A-Z]|[А-Я])"), RegexOptions.IgnoreCase);
mytext = replace_up.Replace(mytext, m=>m.ToString().ToUpper());
Для добавления многоточия вместо
(\.|\!|\?)сделал
(\.|\!|\?|...)И для кавычек:
(«|"")



Интересное в разделе «Улежненькая дняфочка»

Новое на сайте