🔎
Общение и досуг Блоги Улежненькая дняфочка

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

Для добавления многоточия вместо
(\.|\!|\?)
сделал
(\.|\!|\?|…)
И для кавычек:
(«|"")