Функция для создания Pascal-регистра? (C#)

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

  1. price_old => Должен быть PriceOld
  2. 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" символ направо от подчеркивания.

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

  1. companysource
  2. financialtrend
  3. accountingchangetype

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

Спасибо,

Paul

14
задан Paul Fryer 2 August 2010 в 09:51
поделиться

5 ответов

Вы можете использовать метод TextInfo.ToTitleCase , а затем удалить символы «_».

Итак, используя методы расширения, которые у меня есть:

http://theburningmonk.com/2010/08/dotnet-tips-string-totitlecase-extension-methods

, вы можете сделать что-то вроде этого:

var s = "price_old";
s.ToTitleCase().Replace("_", string.Empty);
23
ответ дан 1 December 2019 в 06:59
поделиться

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

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

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

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

2
ответ дан 1 December 2019 в 06:59
поделиться

Ну, первое, что легко:

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

возвращает PriceOld

Второе, намного сложнее. Поскольку companysource может быть CompanySource или, может быть, CompanysOurce , может быть автоматизирован, но довольно ошибочен. Вам понадобится словарь английского языка , и вы сможете угадать (ну, ну, я имею в виду много ), какое сочетание слов является правильным.

11
ответ дан 1 December 2019 в 06:59
поделиться

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

Если вы введете ваш пример ввода, Google и Bing предложат следующее:

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

Смотрите этот пример.

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

0
ответ дан 1 December 2019 в 06:59
поделиться

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

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
ответ дан 1 December 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: