Vraag De beste manier om Pascal Case om te zetten naar een zin


Wat is de beste manier om van Pascal Case (upper Camel Case) naar een zin te converteren?

Bijvoorbeeld beginnend met

"AwaitingFeedback"

en dat converteren naar

"Awaiting feedback"

C # heeft de voorkeur, maar ik zou het kunnen converteren van Java of vergelijkbaar.


59
2017-11-27 09:30


oorsprong


antwoorden:


public static string ToSentenceCase(this string str)
{
    return Regex.Replace(str, "[a-z][A-Z]", m => m.Value[0] + " " + char.ToLower(m.Value[1]));
}

In versies van Visual Studio na 2015 kun je het doen

public static string ToSentenceCase(this string str)
{
    return Regex.Replace(str, "[a-z][A-Z]", m => $"{m.Value[0]} {char.ToLower(m.Value[1])}");
}

Gebaseerd op: Pascal-case naar zinnen converteren met reguliere expressie


60
2017-07-31 09:04



Alsjeblieft...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CamelCaseToString
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(CamelCaseToString("ThisIsYourMasterCallingYou"));   
        }

        private static string CamelCaseToString(string str)
        {
            if (str == null || str.Length == 0)
                return null;

            StringBuilder retVal = new StringBuilder(32);

            retVal.Append(char.ToUpper(str[0]));
            for (int i = 1; i < str.Length; i++ )
            {
                if (char.IsLower(str[i]))
                {
                    retVal.Append(str[i]);
                }
                else
                {
                    retVal.Append(" ");
                    retVal.Append(char.ToLower(str[i]));
                }
            }

            return retVal.ToString();
        }
    }
}

15
2017-11-27 09:42



Dit werkt voor mij:

Regex.Replace(strIn, "([A-Z]{1,2}|[0-9]+)", " $1").TrimStart()

15
2018-05-28 05:45



Ik zal het liefst gebruiken Humanizer voor deze. Humanizer is een Portable Class Library die voldoet aan al uw .NET-behoeften voor het manipuleren en weergeven van tekenreeksen, enums, datums, tijden, tijden, nummers en hoeveelheden.

Kort antwoord

"AwaitingFeedback".Humanize() => Awaiting feedback

Lang en beschrijvend antwoord

Humanizer kan veel meer werk doen andere voorbeelden zijn:

"PascalCaseInputStringIsTurnedIntoSentence".Humanize() => "Pascal case input string is turned into sentence"
"Underscored_input_string_is_turned_into_sentence".Humanize() => "Underscored input string is turned into sentence"
"Can_return_title_Case".Humanize(LetterCasing.Title) => "Can Return Title Case"
"CanReturnLowerCase".Humanize(LetterCasing.LowerCase) => "can return lower case"

De volledige code is:

using Humanizer;
using static System.Console;

namespace HumanizerConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            WriteLine("AwaitingFeedback".Humanize());
            WriteLine("PascalCaseInputStringIsTurnedIntoSentence".Humanize());
            WriteLine("Underscored_input_string_is_turned_into_sentence".Humanize());
            WriteLine("Can_return_title_Case".Humanize(LetterCasing.Title));
            WriteLine("CanReturnLowerCase".Humanize(LetterCasing.LowerCase));
        }
    }
}

uitgang

Op feedback wachten

Pascal case invoer string wordt omgezet in een zin

Onderstreepte invoerstring wordt omgezet in zin Kan titelcase retourneren

kan kleine letters retourneren

Als u liever uw eigen C # -code schrijft, kunt u dit bereiken door een aantal C # -code dingen te schrijven die al door anderen zijn beantwoord.


8
2018-05-28 16:14



Dit is net als @SSTA, maar is efficiënter dan TrimStart aanroepen.

Regex.Replace("ThisIsMyCapsDelimitedString", "(\\B[A-Z])", " $1")

6
2018-06-06 20:08



Vond dit in de MvcContrib-bron, lijkt hier nog niet te worden genoemd.

return Regex.Replace(input, "([A-Z])", " $1", RegexOptions.Compiled).Trim();

6
2017-07-11 12:36



Hier is een eenvoudige manier om het te doen die ik bedacht met Regex

public static string CamelCaseToSentence(this string value)
{
    var sb = new StringBuilder();
    var firstWord = true;

    foreach (var match in Regex.Matches(value, "([A-Z][a-z]+)|[0-9]+"))
    {
        if (firstWord)
        {
            sb.Append(match.ToString());
            firstWord = false;
        }
        else
        {
            sb.Append(" ");
            sb.Append(match.ToString().ToLower());
        }
    }

    return sb.ToString();
}

Het zal ook getallen afsplitsen die ik niet heb aangegeven, maar nuttig zou zijn.


4
2017-11-27 09:48



Ik zou een regex gebruiken, een spatie invoegen voor elk hoofdletterteken en dan alle tekenreeksen verlagen.

    string spacedString = System.Text.RegularExpressions.Regex.Replace(yourString, "\B([A-Z])", " \k");
    spacedString = spacedString.ToLower();

2
2017-11-27 09:41