Лучший способ конвертировать Pascal Case в предложение - PullRequest
65 голосов
/ 27 ноября 2008

Как лучше всего преобразовать регистр Паскаля (верхний регистр верблюда) в предложение.

Например, начиная с

"AwaitingFeedback"

и преобразование этого в

"Awaiting feedback"

C # предпочтительно, но я могу преобразовать его из Java или аналогичного.

Ответы [ 15 ]

1 голос
/ 12 июля 2018

Просто потому, что все используют Regex (кроме этого парня ), вот реализация с StringBuilder, которая была примерно в 5x быстрее в моих тестах. Включает проверку номеров тоже.

"SomeBunchOfCamelCase2".FromCamelCaseToSentence == "Some Bunch Of Camel Case 2"

public static string FromCamelCaseToSentence(this string input) {
    if(string.IsNullOrEmpty(input)) return input;

    var sb = new StringBuilder();
    // start with the first character -- consistent camelcase and pascal case
    sb.Append(char.ToUpper(input[0]));

    // march through the rest of it
    for(var i = 1; i < input.Length; i++) {
        // any time we hit an uppercase OR number, it's a new word
        if(char.IsUpper(input[i]) || char.IsDigit(input[i])) sb.Append(' ');
        // add regularly
        sb.Append(input[i]);
    }

    return sb.ToString();
}
1 голос
/ 15 февраля 2015

Я обнаружил, что делаю что-то подобное, и я ценю точку отсчета в этом обсуждении. Это моё решение, помещенное как метод расширения в строковый класс в контексте консольного приложения.

using System;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string piratese = "avastTharMatey";
            string ivyese = "CheerioPipPip";

            Console.WriteLine("{0}\n{1}\n", piratese.CamelCaseToString(), ivyese.CamelCaseToString());
            Console.WriteLine("For Pete\'s sake, man, hit ENTER!");
            string strExit = Console.ReadLine();
        }

    }

    public static class StringExtension
    {
        public static string CamelCaseToString(this string str)
        {
            StringBuilder retVal = new StringBuilder(32);

            if (!string.IsNullOrEmpty(str))
            {
                string strTrimmed = str.Trim();

                if (!string.IsNullOrEmpty(strTrimmed))
                {
                    retVal.Append(char.ToUpper(strTrimmed[0]));

                    if (strTrimmed.Length > 1)
                    {
                        for (int i = 1; i < strTrimmed.Length; i++)
                        {
                            if (char.IsUpper(strTrimmed[i])) retVal.Append(" ");

                            retVal.Append(char.ToLower(strTrimmed[i]));
                        }
                    }
                }
            }
            return retVal.ToString();
        }
    }
}
1 голос
/ 13 октября 2009

Решение xquery, которое работает как для UpperCamel, так и для lowerCamel:

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

declare function content:sentenceCase($string)
{
let $firstCharacter := substring($string, 1, 1)
let $remainingCharacters := substring-after($string, $firstCharacter)
return
concat(upper-case($firstCharacter),lower-case(replace($remainingCharacters, '([A-Z])', ' $1')))
};

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

declare function content:titleCase($string)
{
let $firstCharacter := substring($string, 1, 1)
let $remainingCharacters := substring-after($string, $firstCharacter)
return
concat(upper-case($firstCharacter),replace($remainingCharacters, '([A-Z])', ' $1'))
};
1 голос
/ 27 ноября 2008

Псевдо-код:

NewString = "";
Loop through every char of the string (skip the first one)
   If char is upper-case ('A'-'Z')
     NewString = NewString + ' ' + lowercase(char)
   Else
     NewString = NewString + char

Лучших путей, возможно, можно добиться с помощью регулярных выражений или процедур замены строк (замените 'X' на 'x')

0 голосов
/ 27 ноября 2008

В основном уже ответили здесь

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

if (char.IsUpper(text[i]))                
    newText.Append(' ');            
newText.Append(text[i]);

до

if (char.IsUpper(text[i]))                
{
    newText.Append(' ');            
    newText.Append(char.ToLower(text[i]));
}
else
   newText.Append(text[i]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...