Разделение слов на основе заглавной буквы - PullRequest
0 голосов
/ 28 мая 2020

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

Из полученных нами значений они имеют общий формат, например

  • NewWest (Слово, начинающееся с заглавной буквы, и везде, где слово должно разрываться, оно будет продолжено заглавной буквой).
  • AB C (Слово будет полностью заглавным)

То, что мы делаем до сих пор, это берем эту категорию в качестве входных и разбиваем их на несколько слов с пробелом, используя этот метод

public static string BreakCategoryIntoMultipleWords(string category)
        {
            StringBuilder builder = new StringBuilder();
            string formatedWord = string.Empty;

        if (category.All(c => char.IsUpper(c)))
        {
            formatedWord = category;
        }
        else
        {
            foreach (char c in category)
            {
                if (Char.IsUpper(c) && builder.Length > 0) builder.Append(' ');
                builder.Append(c);
            }
            formatedWord = builder.ToString();
        }
        return formatedWord;
    }

Текущий метод вернет это значение для следующего входа

  • AB C (ввод)> AB C (вывод)
  • NewWest (ввод)> New West (вывод)
  • NewBellCan (ввод)> New Bell Can

Был замечен третий формат

  • ABCXyxxx

  • XCVbbbb

  • RRDddddddvvvv

    Требуемые выходные данные:

  • ABCXyxxx (вход)> AB C Xyxxx (Так как после заглавной буквы X все буквы маленькие, значит слово сломано)

  • XCVbbbb (ввод)> X C Vbbb (Так как после заглавной буквы V все буквы маленький означает, что слово сломано)

  • RRDddddddvvvv (ввод)> RR Dddddddvvvv (Поскольку после заглавной буквы D все буквы маленькие, это означает, что слово сломано)

Как мне реализовать это в существующем методе, чтобы все три формата работали правильно.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Добавляя к ответу @fubo, вы также можете использовать Split и избегать TrimStart:

var z = string.Join(' ', Regex.Split(s, "(?!^)(?=[A-Z][a-z])"));
1 голос
/ 28 мая 2020

Подход RegEx: https://dotnetfiddle.net/42gyod

string result = new Regex("(?=[A-Z][a-z])").Replace(input, " ").TrimStart();

Объяснение Regex

  • (?= ) положительный взгляд вперед - это соответствует символам перед match
  • [A-Z][a-z] соответствует точно одной заглавной и одной строчной буквам

, поэтому выполняется поиск заглавной и маленькой буквы и вставляется пробел перед ними - см. https://regex101.com/r/PCSlOy/1

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