Splitting CamelCase

前端 未结 15 2429
盖世英雄少女心
盖世英雄少女心 2020-12-07 10:56

This is all asp.net c#.

I have an enum

public enum ControlSelectionType 
{
    NotApplicable = 1,
    SingleSelectRadioButtons = 2,
    SingleSelectD         


        
相关标签:
15条回答
  • 2020-12-07 11:35

    Using LINQ:

    var chars = ControlSelectionType.NotApplicable.ToString().SelectMany((x, i) => i > 0 && char.IsUpper(x) ? new char[] { ' ', x } : new char[] { x });
    
    Console.WriteLine(new string(chars.ToArray()));
    
    0 讨论(0)
  • 2020-12-07 11:36

    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);
    
    0 讨论(0)
  • 2020-12-07 11:39

    If C# 3.0 is an option you can use the following one-liner to do the job:

    
    Regex.Matches(YOUR_ENUM_VALUE_NAME, "[A-Z][a-z]+").OfType<Match>().Select(match => match.Value).Aggregate((acc, b) => acc + " " + b).TrimStart(' ');
    
    0 讨论(0)
  • 2020-12-07 11:39

    Tillito's answer does not handle strings already containing spaces well, or Acronyms. This fixes it:

    public static string SplitCamelCase(string input)
    {
        return Regex.Replace(input, "(?<=[a-z])([A-Z])", " $1", RegexOptions.Compiled);
    }
    
    0 讨论(0)
  • 2020-12-07 11:39

    Try this:

    using System;
    using System.Linq;
    using System.Collections.Generic;
    
    public class Program
    {
        public static void Main()
        {
            Console
                .WriteLine(
                    SeparateByCamelCase("TestString") == "Test String" // True
                );
        }
    
        public static string SeparateByCamelCase(string str)
        {
            return String.Join(" ", SplitByCamelCase(str));
        }
    
        public static IEnumerable<string> SplitByCamelCase(string str) 
        {
            if (str.Length == 0) 
                return new List<string>();
    
            return 
                new List<string> 
                { 
                    Head(str) 
                }
                .Concat(
                    SplitByCamelCase(
                        Tail(str)
                    )
                );
        }
    
        public static string Head(string str)
        {
            return new String(
                        str
                            .Take(1)
                            .Concat(
                                str
                                    .Skip(1)
                                    .TakeWhile(IsLower)
                            )
                            .ToArray()
                    );
        }
    
        public static string Tail(string str)
        {
            return new String(
                        str
                            .Skip(
                                Head(str).Length
                            )
                            .ToArray()
                    );
        }
    
        public static bool IsLower(char ch) 
        {
            return ch >= 'a' && ch <= 'z';
        }
    }
    

    See sample online

    0 讨论(0)
  • 2020-12-07 11:42

    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

    0 讨论(0)
提交回复
热议问题