123 votes

.NET - Comment diviser une chaîne délimitée par des "caps" en un tableau ?

Comment faire à partir de cette chaîne : "ThisIsMyCapsDelimitedString"

...à cette chaîne : "C'est ma chaîne délimitée par des majuscules"

Le plus petit nombre de lignes de code en VB.net est préférable, mais le C# est également le bienvenu.

A la vôtre !

187voto

Markus Jarderot Points 33893

Je l'ai fait il y a quelque temps. Il fait correspondre chaque composant d'un nom CamelCase.

/([A-Z]+(?=$|[A-Z][a-z])|[A-Z]?[a-z]+)/g

Par exemple :

"SimpleHTTPServer" => ["Simple", "HTTP", "Server"]
"camelCase" => ["camel", "Case"]

Pour convertir cela, il suffit d'insérer des espaces entre les mots :

Regex.Replace(s, "([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))", "$1 ")

Edit : Autoriser les lettres initiales en minuscules (c'est à dire "lowerCamelCase" ), comme l'a souligné Drew Noakes. Le seul changement est un "?" après après le dernier "[A-Z]" .

41voto

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

22voto

JoshL Points 4143

Excellente réponse, MizardX ! J'ai légèrement modifié le système pour traiter les chiffres comme des mots séparés, de sorte que "AdresseLigne1" devienne "Ligne d'adresse 1" au lieu de "Ligne d'adresse1" :

Regex.Replace(s, "([a-z](?=[A-Z0-9])|[A-Z](?=[A-Z][a-z]))", "$1 ")

18voto

Troy Howard Points 1798

Juste pour varier un peu... Voici une méthode d'extension qui n'utilise pas de regex.

public static class CamelSpaceExtensions
{
    public static string SpaceCamelCase(this String input)
    {
        return new string(InsertSpacesBeforeCaps(input).ToArray());
    }

    private static IEnumerable<char> InsertSpacesBeforeCaps(IEnumerable<char> input)
    {
        foreach (char c in input)
        {
            if (char.IsUpper(c)) 
            { 
                yield return ' '; 
            }

            yield return c;
        }
    }
}

12voto

Pseudo Masochist Points 1579

L'excellent commentaire de Grant Wagner mis à part :

Dim s As String = RegularExpressions.Regex.Replace("ThisIsMyCapsDelimitedString", "([A-Z])", " $1")

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