80 votes

Meilleur moyen de convertir Pascal Case en une phrase

Quel est le meilleur moyen de convertir du Pascal Case (Camel Case supérieur) en une phrase.

Par exemple en commençant par

"AwaitingFeedback"

et en le convertissant en

"En attente de feedback"

C# de préférence mais je pourrais le convertir depuis Java ou similaire.

2 votes

Le camel case attendFeedback et non AwaitingFeedback (Pascal Case). De plus, ce que vous voulez faire n'est pas complètement possible. Que pensez-vous de désactiverGPS? Existe-t-il une solution suffisamment générale pour gérer ces cas?

0 votes

@kgiannakakis a modifié la question en conséquence. J'oublie toujours dans quel sens vont les noms, surtout avec les casse en Camel Case.

9voto

JefClaes Points 1416

Je l'ai trouvé dans la source de MvcContrib, cela ne semble pas avoir été mentionné ici pour le moment.

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

5voto

drzaus Points 3344

Juste parce que tout le monde utilise Regex (sauf ce gars), voici une implémentation avec StringBuilder qui était environ 5x plus rapide dans mes tests. Inclut également la vérification des nombres.

"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();
    // commencer par le premier caractère -- camelcase et pascal case cohérents
    sb.Append(char.ToUpper(input[0]));

    // parcourir le reste
    for(var i = 1; i < input.Length; i++) {
        // chaque fois que nous rencontrons une majuscule OU un nombre, c'est un nouveau mot
        if(char.IsUpper(input[i]) || char.IsDigit(input[i])) sb.Append(' ');
        // ajouter normalement
        sb.Append(input[i]);
    }

    return sb.ToString();
}

4voto

Garry Shutler Points 20898

Voici une manière de base de le faire que j'ai trouvée en utilisant 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();
}

Cela séparera également les nombres, ce que je n'ai pas spécifié mais qui serait utile.

3voto

Andrew Bullock Points 14899
chaîne chameau = "MaChaineCamelCase";
string s = Regex.Replace(camel, "([A-Z])", " $1").ToLower().Trim();
Console.WriteLine(s.Substring(0,1).ToUpper() + s.Substring(1));

Edit: Je n'ai pas remarqué vos exigences concernant la casse, modifié en conséquence. Vous pourriez utiliser un matchevaluator pour effectuer la casse, mais je pense qu'une sous-chaîne est plus simple. Vous pourriez également l'envelopper dans un 2ème remplacement regex où vous changez le premier caractère

"^\w"

en majuscule

\U (je crois)

2voto

Antoine Points 1041

Je utiliserais une regex, insérant un espace avant chaque caractère en majuscule, puis en diminuant toute la chaîne.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X