Использование заглавных букв в строке с помощью c # - PullRequest
19 голосов
/ 30 ноября 2010

Мне нужно взять строку и использовать в ней слова с большой буквы. Некоторые слова («in», «at» и т. Д.) Не пишутся с большой буквы и заменяются на строчные, если встречаются. Первое слово всегда должно начинаться с заглавной буквы. Фамилии, такие как «McFly», не входят в текущую область, поэтому к ним будет применяться то же правило - только первая буква с большой буквы.

Например: «мышей и мужчин по CNN» следует заменить на «мышей и мужчин по CNN». ( Поэтому ToTitleString здесь не будет работать )

Мне интересно, что было бы лучшим способом сделать это. Я подумал о том, чтобы разбить строку на пробелы и пролистать каждое слово, изменив его при необходимости и конкатенируя к предыдущему слову, и так далее. Это кажется довольно наивным, и мне было интересно, есть ли лучший способ сделать это, используя .Net 3.5.

Ответы [ 10 ]

15 голосов
/ 30 ноября 2010

Используйте

Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase("of mice and men By CNN");

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

15 голосов
/ 30 ноября 2010

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

Редактировать:

Вы можете сделать это за два прохода, используя регулярные выражения

var result = Regex.Replace("of mice and men isn't By CNN", @"\b(\w)", m => m.Value.ToUpper());
result = Regex.Replace(result, @"(\s(of|in|by|and)|\'[st])\b", m => m.Value.ToLower(), RegexOptions.IgnoreCase);

Это выводит Of Mice and Men Isn't by CNN.

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

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

6 голосов
/ 05 марта 2013

Вот ответ Как использовать заглавные буквы

CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;

Console.WriteLine(textInfo.ToTitleCase(title));
Console.WriteLine(textInfo.ToLower(title));
Console.WriteLine(textInfo.ToUpper(title));
3 голосов
/ 30 ноября 2010

Почему бы не использовать сначала ToTitleCase(), а затем сохранить список применимых слов и Replace вернуться к строчной версии этих применимых слов (при условии, что этот список небольшой).

Список подходящих слов можно было бы сохранить в словаре и довольно эффективно перебирать, заменяя на эквивалент .ToLower().

2 голосов
/ 30 ноября 2010

Попробуйте что-то вроде этого:

public static string TitleCase(string input, params string[] dontCapitalize) {
   var split = input.Split(' ');
   for(int i = 0; i < split.Length; i++)
        split[i] = i == 0 
          ? CapitalizeWord(split[i]) 
          : dontCapitalize.Contains(split[i])
             ? split[i]
             : CapitalizeWord(split[i]);
   return string.Join(" ", split);
}
public static string CapitalizeWord(string word)
{
    return char.ToUpper(word[0]) + word.Substring(1);
}

Затем вы можете позже обновить метод CapitalizeWord, если вам нужно обрабатывать сложные фамилии.Добавьте эти методы в класс и используйте его так:

SomeClass.TitleCase("a test is a sentence", "is", "a"); // returns "A Test is a Sentence"
1 голос
/ 06 февраля 2014

Небольшое улучшение ответа Джонни:

var result = Regex.Replace(s.Trim(), @"\b(\w)", m => m.Value.ToUpper());
        result = Regex.Replace(result, @"\s(of|in|by|and)\s", m => m.Value.ToLower(), RegexOptions.IgnoreCase);
        result = result.Replace("'S", "'s");
1 голос
/ 30 ноября 2010

У вас может быть словарь, содержащий слова, которые вы хотели бы игнорировать, разбить предложение на фразы (.split ('')) и для каждой фразы проверить, существует ли фраза в словаре, если нет, использовать заглавные буквыпервый символ, а затем добавьте строку в строковый буфер.Если фраза, которую вы сейчас обрабатываете, находится в словаре, просто добавьте ее в строковый буфер.

0 голосов
/ 30 ноября 2010

Неумный подход, который обрабатывает простой случай:

var s = "of mice and men By CNN";
var sa = s.Split(' ');
for (var i = 0; i < sa.Length; i++)
    sa[i] = sa[i].Substring(0, 1).ToUpper() + sa[i].Substring(1);
var sout = string.Join(" ", sa);
Console.WriteLine(sout);
0 голосов
/ 30 ноября 2010

Самым простым очевидным решением (для предложений на английском языке) было бы:

  • "sentence".Split(" ") предложение с пробелами
  • Цикл по каждому пункту
  • Использование заглавных буквпервая буква каждого элемента - item[i][0].ToUpper(),
  • Возвращается обратно в строку, соединенную пробелом.
  • Повторите этот процесс с "."и "," используя эту новую строку.
0 голосов
/ 30 ноября 2010

Вы должны создать свою собственную функцию, как вы описываете.

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