Splitting CamelCase Splitting CamelCase asp.net asp.net

Splitting CamelCase


I used:

    public static string SplitCamelCase(string input)    {        return System.Text.RegularExpressions.Regex.Replace(input, "([A-Z])", " $1", System.Text.RegularExpressions.RegexOptions.Compiled).Trim();    }

Taken from http://weblogs.asp.net/jgalloway/archive/2005/09/27/426087.aspx

vb.net:

Public Shared Function SplitCamelCase(ByVal input As String) As String    Return System.Text.RegularExpressions.Regex.Replace(input, "([A-Z])", " $1", System.Text.RegularExpressions.RegexOptions.Compiled).Trim()End Function


Indeed a regex/replace is the way to go as described in the other answer, however this might also be of use to you if you wanted to go a different direction

    using System.ComponentModel;    using System.Reflection;

...

    public static string GetDescription(System.Enum value)    {        FieldInfo fi = value.GetType().GetField(value.ToString());        DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);        if (attributes.Length > 0)            return attributes[0].Description;        else            return value.ToString();    }

this will allow you define your Enums as

public enum ControlSelectionType {    [Description("Not Applicable")]    NotApplicable = 1,    [Description("Single Select Radio Buttons")]    SingleSelectRadioButtons = 2,    [Description("Completely Different Display Text")]    SingleSelectDropDownList = 3,}

Taken from

http://www.codeguru.com/forum/archive/index.php/t-412868.html


This regex (^[a-z]+|[A-Z]+(?![a-z])|[A-Z][a-z]+) can be used to extract all words from the camelCase or PascalCase name. It also works with abbreviations anywhere inside the name.

  • MyHTTPServer will contain exactly 3 matches: My, HTTP, Server
  • myNewXMLFile will contain 4 matches: my, New, XML, File

You could then join them into a single string using string.Join.

string name = "myNewUIControl";string[] words = Regex.Matches(name, "(^[a-z]+|[A-Z]+(?![a-z])|[A-Z][a-z]+)")    .OfType<Match>()    .Select(m => m.Value)    .ToArray();string result = string.Join(" ", words);

As @DanielB noted in the comments, that regex won't work for numbers (and with underscores), so here is an improved version that supports any identifier with words, acronyms, numbers, underscores (slightly modified @JoeJohnston's version), see online demo (fiddle):

([A-Z]+(?![a-z])|[A-Z][a-z]+|[0-9]+|[a-z]+)

Extreme example: __snake_case12_camelCase_TLA1ABCsnake, case, 12, camel, Case, TLA, 1, ABC