Как сделать заглавной первую букву каждого предложения? - PullRequest
2 голосов
/ 07 мая 2010

Я знаю, как использовать заглавные буквы в каждом слове. Но я хочу знать, как сделать заглавной первую букву каждого предложения в C #.

Ответы [ 8 ]

12 голосов
/ 07 мая 2010

Это не обязательно тривиальная проблема. Предложения могут заканчиваться несколькими различными знаками препинания, и те же самые знаки препинания не всегда обозначают конец предложения (такие сокращения, как «Доктор», могут представлять особую проблему, поскольку их потенциально много).

При этом вы, возможно, сможете найти "достаточно хорошее" решение, используя регулярные выражения для поиска слов после пунктуации, заканчивающейся предложением, но вам придется добавить немало особых случаев. Может быть проще обрабатывать строку символ за символом или слово за словом. Вам все равно придется обрабатывать все те же особые случаи, но это может быть проще, чем пытаться встроить это в регулярное выражение.

Есть много странных правил для грамматики и пунктуации. Любое решение, которое вы придумали, вероятно, не сможет принять их все во внимание. Некоторые вещи для рассмотрения:

  • Предложения могут заканчиваться разными знаками препинания (.!?)
  • Некоторые знаки препинания в конце предложения могут также использоваться в середине предложения (например, такие сокращения, как Dr. Mr., например.)
  • Предложения могут содержать вложенные предложения. Цитаты могут представлять определенную проблему (например, он сказал: «Это сложная проблема! Интересно, - размышлял он, - если она может быть решена».)
3 голосов
/ 07 мая 2010

В первом приближении вы, вероятно, можете рассматривать любую последовательность, например [a-z]\.[ \n\t], как конец предложения.

2 голосов
/ 07 мая 2010

Рассматривать предложение как слово, содержащее пробелы, оканчивающиеся точкой.

1 голос
/ 07 мая 2010

На этой странице есть некоторый VB-код , который не должно быть слишком сложным для преобразования в C #.

Тем не менее, последующие сообщения указывают на ошибки в алгоритме.

Этот блог содержит код C #, который утверждает, что работает:

Он автоматически заглавными буквами первой буквы после каждой полной остановки (точка), вопросительный знак и восклицательный знак.

ОБНОВЛЕНИЕ 16 февраля 2010 г .: я переработал его, чтобы он не влиял на строки, такие как URL и т. П.

0 голосов
/ 01 сентября 2016

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

public static string ToTitleCase(string strX)
    {
        string[] aryWords = strX.Trim().Split(' ');

        List<string> lstLetters = new List<string>();
        List<string> lstWords = new List<string>();

        foreach (string strWord in aryWords)
        {
            int iLCount = 0;
            foreach (char chrLetter in strWord.Trim())
            {
                if (iLCount == 0)
                {
                    lstLetters.Add(chrLetter.ToString().ToUpper());
                }
                else
                {
                    lstLetters.Add(chrLetter.ToString().ToLower());
                }
                iLCount++;
            }
            lstWords.Add(string.Join("", lstLetters));
            lstLetters.Clear();
        }

        string strNewString = string.Join(" ", lstWords);

        return strNewString;
    }
0 голосов
/ 02 января 2015

Я знаю, что немного опоздал, но так же, как и Вам, мне нужно было использовать каждый первый символ в каждом предложении. Я просто упал сюда (и много других страниц, пока я занимался исследованиями) и не нашел ничего, что могло бы мне помочь. Итак, я сжег несколько нейронов и сам создал алгоритм.

Вот мой метод расширения, чтобы сделать предложения заглавными:

public static string CapitalizeSentences(this string Input)
    {
        if (String.IsNullOrEmpty(Input))
            return Input;

        if (Input.Length == 1)
            return Input.ToUpper();


        Input = Regex.Replace(Input, @"\s+", " ");

        Input = Input.Trim().ToLower();
        Input = Char.ToUpper(Input[0]) + Input.Substring(1);


        var objDelimiters = new string[] { ". ", "! ", "? " };
        foreach (var objDelimiter in objDelimiters)
        {
            var varDelimiterLength = objDelimiter.Length;

            var varIndexStart = Input.IndexOf(objDelimiter, 0);
            while (varIndexStart > -1)
            {
                Input = Input.Substring(0, varIndexStart + varDelimiterLength) + (Input[varIndexStart + varDelimiterLength]).ToString().ToUpper() + Input.Substring((varIndexStart + varDelimiterLength) + 1);

                varIndexStart = Input.IndexOf(objDelimiter, varIndexStart + 1);
            }
        }


        return Input;
    }


Подробности об алгоритме:
Этот простой алгоритм начинает удалять все двойные пробелы. Затем он использует первый символ строки. тогда ищите каждый разделитель. Когда найдете один, используйте следующий символ с большой буквы.
Я упростила добавление / удаление или редактирование разделителей, поэтому вы можете многое изменить, как работает код, с небольшими изменениями в нем. Он не проверяет, выходят ли подстроки из длины строки, потому что разделители заканчиваются пробелами, а алгоритм начинается с «Trim ()», поэтому за каждым разделителем, если он найден в строке, будет следовать другой символ.

Важно:
Вы не указали, что именно вам нужно. Я имею в виду, что это корректор грамматики, это просто предварительный текст и т. Д. Итак, важно учитывать, что мой алгоритм просто идеально подходит для моих нужд, который может отличаться от вашего.
* Этот алгоритм был создан для форматирования «описания продукта», которое не нормализовано (почти всегда полностью прописными буквами) в хорошем формате для пользователя (чтобы быть более конкретным, мне нужно показать красивое и «меньшее») текст для пользователя. Таким образом, все символы в верхнем регистре просто противоположны тому, что я хочу). Таким образом, он не был создан, чтобы быть грамматически совершенным.
* Кроме того, могут быть некоторые исключения, когда символ не будет в верхнем регистре из-за плохого форматирования.
* Я предпочитаю включать пробелы в разделитель, поэтому "http://www.stackoverflow.com" не станет" http://www.Stackoverflow.Com". С другой стороны, предложения типа "коробка синего цвета. Она на полу" будет становится "Коробка синего цвета. Она на полу", а не"Коробка синего цвета. Она на полу"
* В случаях аббревиатур оно будет написано заглавными буквами, но опять же, это не проблема, потому что мне нужно просто показать описание продукта (где грамматика не очень критична). А в таких сокращениях, как «Мистер» или «Доктор», самый первый символ - это имя, поэтому его нужно писать с большой буквы.

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

Надеюсь, я смогу кому-нибудь помочь!

0 голосов
/ 21 декабря 2010

Мне нужно было сделать нечто подобное, и это послужило моим целям.Я передаю свои «предложения» как IEnumerable строк.

// Read sentences from text file (each sentence on a separate line)
IEnumerable<string> lines = File.ReadLines(inputPath);

// Call method below
lines = CapitalizeFirstLetterOfEachWord(lines);

private static IEnumerable<string> CapitalizeFirstLetterOfString(IEnumerable<string> inputLines)
{
  // Will output: Lorem lipsum et

  List<string> outputLines = new List<string>();

  TextInfo textInfo = new CultureInfo("en-US", false).TextInfo;

  foreach (string line in inputLines)
  {
    string lineLowerCase = textInfo.ToLower(line);
    string[] lineSplit = lineLowerCase.Split(' ');
    bool first = true;

   for (int i = 0; i < lineSplit.Length; i++ )
    {
      if (first)
      {
        lineSplit[0] = textInfo.ToTitleCase(lineSplit[0]);
        first = false;
      }
    }

    outputLines.Add(string.Join(" ", lineSplit));
  }

  return outputLines;

}

0 голосов
/ 07 мая 2010

Не забывайте предложения с круглыми скобками. Кроме того, * если используется как указатель для жирного текста.

http://www.grammarbook.com/punctuation/parens.asp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...