Функция для создания Паскаля? (С#)

Мне нужна функция, которая возьмет строку и "pascal case". Единственным индикатором начала нового слова является символ подчеркивания. Вот несколько примеров строк, которые необходимо очистить:

  • price_old = > Должен быть PriceOld
  • rank_old = > Должен быть RankOld

Я начал работать над функцией, которая делает первый верхний регистр символов:

public string FirstCharacterUpper(string value)
{
 if (value == null || value.Length == 0)
  return string.Empty;
 if (value.Length == 1)
  return value.ToUpper();
 var firstChar = value.Substring(0, 1).ToUpper();
 return firstChar + value.Substring(1, value.Length - 1);
}

То, что вышеприведенная функция не делает, это удалить символ подчеркивания и "ToUpper" символ справа от подчеркивания.

Кроме того, любые идеи о том, как pascal использовать строку, которая не имеет никаких индикаторов (например, подчеркивание). Например:

  • companysource
  • financialtrend
  • accountingchangetype

Основная задача здесь - определить, где заканчивается одно слово, а другое начинается. Думаю, мне нужен какой-то поисковый словарь, чтобы определить, где начинаются новые слова? Есть ли там библиотеки для этого?

Спасибо,

Пол

Ответы

Ответ 2

Хорошо, первое, что легко:

string.Join("", "price_old".Split(new [] { '_' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Substring(0, 1).ToUpper() + s.Substring(1)).ToArray());

возвращает PriceOld

Во-вторых, это сложнее. Поскольку companysource может быть companysource или, может быть, companysource, может быть автоматизирован, но является довольно неисправным. Вам понадобится английский словарь и сделайте некоторое предположение (ага, я имею в виду много), на котором правильная комбинация слов.

Ответ 3

Попробуйте следующее:

public static string GetPascalCase(string name)
{
    return Regex.Replace(name, @"^\w|_\w", 
        (match) => match.Value.Replace("_", "").ToUpper());
}

Console.WriteLine(GetPascalCase("price_old")); // => Should be PriceOld
Console.WriteLine(GetPascalCase("rank_old" )); // => Should be RankOld

Ответ 4

С подчеркиванием:

s = Regex.Replace(s, @"(?:^|_)([a-z])",
      m => m.Groups[1].Value.ToUpper());

Без подчеркивания:

Ты сам по себе. Но идти вперед и искать; Я был бы удивлен, если бы никто не делал этого раньше.

Ответ 5

Для вашей второй проблемы разделения конкатенированных слов вы можете использовать наших лучших друзей Google и Ко. Если ваш конкатенированный ввод состоит из обычных английских слов, поисковые системы имеют хорошую скорость для отдельных слов в качестве альтернативного поиска запроса

Если вы введете свой образец ввода, Google и Bing предложите следующее:

original             | Google                | Bing
=====================================================================
companysource        | company source        | company source 
financialtrend       | financial trend       | financial trend
accountingchangetype | accounting changetype | accounting change type

См. this exaple.

Написание маленького скребка экрана для этого должно быть довольно простым.

Ответ 6

для тех, кому требуется решение без регулярных выражений

 public static string RemoveAllSpaceAndConcertToPascalCase(string status)
        {
            var textInfo = new System.Globalization.CultureInfo("en-US").TextInfo;
            var titleCaseStr = textInfo.ToTitleCase(status);
            string result = titleCaseStr.Replace("_","").Replace(" ", "");

            return result;
        }