Splitting CamelCase

前端 未结 15 2490
盖世英雄少女心
盖世英雄少女心 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:29

    Here's an extension method that handles numbers and multiple uppercase characters sanely, and also allows for upper-casing specific acronyms in the final string:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Globalization;
    using System.Text.RegularExpressions;
    using System.Web.Configuration;
    
    namespace System
    {
        /// 
        /// Extension methods for the string data type
        /// 
        public static class ConventionBasedFormattingExtensions
        {
            /// 
            /// Turn CamelCaseText into Camel Case Text.
            /// 
            /// 
            /// 
            /// Use AppSettings["SplitCamelCase_AllCapsWords"] to specify a comma-delimited list of words that should be ALL CAPS after split
            /// 
            /// wordWordIDWord1WordWORDWord32Word2
            /// Word Word ID Word 1 Word WORD Word 32 Word 2
            /// 
            /// wordWordIDWord1WordWORDWord32WordID2ID
            /// Word Word ID Word 1 Word WORD Word 32 Word ID 2 ID
            /// 
            /// WordWordIDWord1WordWORDWord32Word2Aa
            /// Word Word ID Word 1 Word WORD Word 32 Word 2 Aa
            /// 
            /// wordWordIDWord1WordWORDWord32Word2A
            /// Word Word ID Word 1 Word WORD Word 32 Word 2 A
            /// 
            public static string SplitCamelCase(this string input)
            {
                if (input == null) return null;
                if (string.IsNullOrWhiteSpace(input)) return "";
    
                var separated = input;
    
                separated = SplitCamelCaseRegex.Replace(separated, @" $1").Trim();
    
                //Set ALL CAPS words
                if (_SplitCamelCase_AllCapsWords.Any())
                    foreach (var word in _SplitCamelCase_AllCapsWords)
                        separated = SplitCamelCase_AllCapsWords_Regexes[word].Replace(separated, word.ToUpper());
    
                //Capitalize first letter
                var firstChar = separated.First(); //NullOrWhiteSpace handled earlier
                if (char.IsLower(firstChar))
                    separated = char.ToUpper(firstChar) + separated.Substring(1);
    
                return separated;
            }
    
            private static readonly Regex SplitCamelCaseRegex = new Regex(@"
                (
                    (?<=[a-z])[A-Z0-9] (?# lower-to-other boundaries )
                    |
                    (?<=[0-9])[a-zA-Z] (?# number-to-other boundaries )
                    |
                    (?<=[A-Z])[0-9] (?# cap-to-number boundaries; handles a specific issue with the next condition )
                    |
                    (?<=[A-Z])[A-Z](?=[a-z]) (?# handles longer strings of caps like ID or CMS by splitting off the last capital )
                )"
                , RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace
            );
    
            private static readonly string[] _SplitCamelCase_AllCapsWords =
                (WebConfigurationManager.AppSettings["SplitCamelCase_AllCapsWords"] ?? "")
                    .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                    .Select(a => a.ToLowerInvariant().Trim())
                    .ToArray()
                    ;
    
            private static Dictionary _SplitCamelCase_AllCapsWords_Regexes;
            private static Dictionary SplitCamelCase_AllCapsWords_Regexes
            {
                get
                {
                    if (_SplitCamelCase_AllCapsWords_Regexes == null)
                    {
                        _SplitCamelCase_AllCapsWords_Regexes = new Dictionary();
                        foreach(var word in _SplitCamelCase_AllCapsWords)
                            _SplitCamelCase_AllCapsWords_Regexes.Add(word, new Regex(@"\b" + word + @"\b", RegexOptions.Compiled | RegexOptions.IgnoreCase));
                    }
    
                    return _SplitCamelCase_AllCapsWords_Regexes;
                }
            }
        }
    }
    

提交回复
热议问题