Функция для создания Паскаля? (С#)
Мне нужна функция, которая возьмет строку и "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
Основная задача здесь - определить, где заканчивается одно слово, а другое начинается. Думаю, мне нужен какой-то поисковый словарь, чтобы определить, где начинаются новые слова? Есть ли там библиотеки для этого?
Спасибо,
Пол
Ответы
Ответ 1
Вы можете использовать метод TextInfo.ToTitleCase, затем удалите символы '_'.
Итак, используя методы расширения, которые у меня есть:
http://theburningmonk.com/2010/08/dotnet-tips-string-totitlecase-extension-methods
вы можете сделать что-то подобное:
var s = "price_old";
s.ToTitleCase().Replace("_", string.Empty);
Ответ 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;
}