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.

2voto

PhiLho Points 23458

Il est facile de le faire en JavaScript (ou PHP, etc.) où vous pouvez définir une fonction dans l'appel de remplacement :

var camel = "AwaitingFeedbackDearMaster";
var sentence = camel.replace(/([A-Z].)/g, function (c) { return ' ' + c.toLowerCase(); });
alert(sentence);

Bien que je n'ai pas résolu le problème de la majuscule initiale... :-)

Maintenant, pour la solution Java :

String ToSentence(String camel)
{
  if (camel == null) return ""; // Ou null...
  String[] words = camel.split("(?=[A-Z])");
  if (words == null) return "";
  if (words.length == 1) return words[0];
  StringBuilder sentence = new StringBuilder(camel.length());
  if (words[0].length() > 0) // Juste au cas où il y a camelCase au lieu de CamelCase
  {
    sentence.append(words[0] + " " + words[1].toLowerCase());
  }
  else
  {
    sentence.append(words[1]);
  }
  for (int i = 2; i < words.length; i++)
  {
    sentence.append(" " + words[i].toLowerCase());
  }
  return sentence.toString();
}

System.out.println(ToSentence("AwaitingAFeedbackDearMaster"));
System.out.println(ToSentence(null));
System.out.println(ToSentence(""));
System.out.println(ToSentence("A"));
System.out.println(ToSentence("Aaagh!"));
System.out.println(ToSentence("stackoverflow"));
System.out.println(ToSentence("disableGPS"));
System.out.println(ToSentence("Ahh89Boo"));
System.out.println(ToSentence("ABC"));

Remarquez le tour de passe-passe pour diviser la phrase sans perdre de caractère...

1voto

schnaader Points 26212

Code pseudo :

NewString = "";
Boucler à travers chaque caractère de la chaîne (sauf le premier)
   Si le caractère est en majuscule ('A'-'Z')
     NewString = NewString + ' ' + minuscule(char)
   Sinon
     NewString = NewString + char

De meilleures façons peuvent peut-être être réalisées en utilisant des expressions régulières ou des routines de remplacement de chaînes (remplacer 'X' par ' x')

1voto

Katana24 Points 111

Une solution XQuery qui fonctionne pour les cas UpperCamel et lowerCamel :

Pour afficher en majuscule au début de chaque phrase (seul le premier caractère du premier mot est en majuscule) :

déclarer une fonction 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')))
};

Pour afficher en majuscule au début de chaque mot (premier caractère de chaque mot en majuscule) :

déclarer une fonction 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'))
};

1voto

sscheider Points 117

Je me suis retrouvé à faire quelque chose de similaire, et j'apprécie d'avoir un point de départ avec cette discussion. Voici ma solution, placée en tant que méthode d'extension de la classe string dans le contexte d'une application console.

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("Pour l'amour de Pete, mon gars, appuie sur ENTRÉE!");
            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();
        }
    }
}

1voto

Ian Mercer Points 19271

La plupart des réponses précédentes divisent les acronymes et les nombres, ajoutant un espace devant chaque caractère. Je voulais que les acronymes et les nombres restent ensemble, donc j'ai écrit une simple machine à états qui émet un espace chaque fois que l'entrée passe d'un état à l'autre.

    /// 
    /// Ajoute un espace avant toute lettre majuscule (mais pas pour une série de majuscules ou de chiffres)
    /// 
    internal static string FromCamelCaseToSentence(string input)
    {
        if (string.IsNullOrEmpty(input)) return String.Empty;

        var sb = new StringBuilder();
        bool upper = true;

        for (var i = 0; i < input.Length; i++)
        {
            bool isUpperOrDigit = char.IsUpper(input[i]) || char.IsDigit(input[i]);
            // à chaque transition vers des majuscules ou des chiffres, c'est un nouveau mot
            if (!upper && isUpperOrDigit)
            {
                sb.Append(' ');
            }
            sb.Append(input[i]);
            upper = isUpperOrDigit;
        }

        return sb.ToString();
    }

Et voici quelques tests :

    [TestCase(null, ExpectedResult = "")]
    [TestCase("", ExpectedResult = "")]
    [TestCase("ABC", ExpectedResult = "ABC")]
    [TestCase("abc", ExpectedResult = "abc")]
    [TestCase("camelCase", ExpectedResult = "camel Case")]
    [TestCase("PascalCase", ExpectedResult = "Pascal Case")]
    [TestCase("Pascal123", ExpectedResult = "Pascal 123")]
    [TestCase("CustomerID", ExpectedResult = "Customer ID")]
    [TestCase("CustomABC123", ExpectedResult = "Custom ABC123")]
    public string CanSplitCamelCase(string input)
    {
        return FromCamelCaseToSentence(input);
    }

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