Макдоналдс к ProperCase в C#

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

11
задан Mark Rucker 2 August 2013 в 21:46
поделиться

8 ответов

Компьютер не может просто волшебным образом узнать, что первая буква «D» в слове «McDonalds» должна быть написана с заглавной буквы. Итак, я думаю, есть два варианта.

  1. У кого-то там может быть программа или библиотека, которые сделают это за вас.

  2. Если это не так, ваш единственный выбор - принять следующий подход: Во-первых, я поискал имя в словаре слов с «интересными» заглавными буквами. Очевидно, вам придется предоставить этот словарь самостоятельно, если он еще не существует. Во-вторых, примените алгоритм, который исправляет некоторые из очевидных, например, кельтские имена, начинающиеся с O 'и Mac и Mc, хотя при достаточно большом пуле имен такой алгоритм, несомненно, будет иметь много ложных срабатываний. Наконец, Используйте заглавную первую букву в каждом имени, которое не соответствует первым двум критериям.

7
ответ дан 3 December 2019 в 03:52
поделиться

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

9
ответ дан 3 December 2019 в 03:52
поделиться

Я написал следующие методы расширения. Не стесняйтесь использовать их.

public static class StringExtensions
{
  public static string ToProperCase( this string original )
  {
    if( original.IsNullOrEmpty() )
      return original;

    string result = _properNameRx.Replace( original.ToLower( CultureInfo.CurrentCulture ), HandleWord );
    return result;
  }

  public static string WordToProperCase( this string word )
  {
    if( word.IsNullOrEmpty() )
      return word;

    if( word.Length > 1 )
      return Char.ToUpper( word[0], CultureInfo.CurrentCulture ) + word.Substring( 1 );

    return word.ToUpper( CultureInfo.CurrentCulture );
  }

  private static readonly Regex _properNameRx = new Regex( @"\b(\w+)\b" );

  private static readonly string[] _prefixes = { "mc" };

  private static string HandleWord( Match m )
  {
    string word = m.Groups[1].Value;

    foreach( string prefix in _prefixes )
    {
      if( word.StartsWith( prefix, StringComparison.CurrentCultureIgnoreCase ) )
        return prefix.WordToProperCase() + word.Substring( prefix.Length ).WordToProperCase();
    }

    return word.WordToProperCase();
  }
}
8
ответ дан 3 December 2019 в 03:52
поделиться

Это интересная проблема. Я не думаю, что существует готовое решение.

Я добавил в закладки следующую статью, которая может быть близка к тому, что вы хотите:

Провайдер правильного формата регистра утерянных и найденных идентификаторов (реализация IFormatProvider)

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

2
ответ дан 3 December 2019 в 03:52
поделиться

Самая сложная часть этого - это алгоритмы выбора заглавной буквы. Сама по себе манипуляция со строкой довольно проста. Идеального способа не существует, поскольку нет «правил» для дел. Одной из стратегий может быть набор правил, таких как «использовать первую букву ... обычно» и «3-ю букву использовать заглавную, если первые две буквы mc ... обычно»

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

1
ответ дан 3 December 2019 в 03:52
поделиться

Для этого необходимо, чтобы ваша программа была способна до некоторой степени интерпретировать английский язык. По крайней мере, суметь разбить строку на набор слов. В .Net Framework нет встроенного API, который мог бы этого добиться.

Однако, если бы он был, вы можете использовать следующий код.

public string ProperCase(string str, Func<string,bool> isWord) {
  var word = new StringBuilder();
  var cur = new StringBuilder();
  for ( var i = 0; i < str.Length; i++ ) {
    cur.Append(cur.Length == 0 ? Char.ToUpper(str[i]) : str[i]));
    if ( isWord(cur.ToString()) {
      word.Append(cur.ToString());
      cur.Length = 0;
    }
  }
  if ( cur.Length > 0 ) {
    word.Append(cur);
  }
  return word.ToString();
}

Это не идеальное решение, но оно дает вам общее представление о структуре

0
ответ дан 3 December 2019 в 03:52
поделиться

Вы можете проверить фамилию в нижнем / смешанном регистре по словарю (файлу), в котором есть правильные регистры, а затем вернуть "реальное" значение из словаря.

У меня был быстро погуглите, чтобы узнать, существует ли он, но безрезультатно!

0
ответ дан 3 December 2019 в 03:52
поделиться
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
string txt = textInfo.ToTitleCase("texthere");
-1
ответ дан 3 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

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