विभाजन CamelCase


80

यह सब asp.net c # है।

मेरे पास एक एनम है

public enum ControlSelectionType 
{
    NotApplicable = 1,
    SingleSelectRadioButtons = 2,
    SingleSelectDropDownList = 3,
    MultiSelectCheckBox = 4,
    MultiSelectListBox = 5
}

इसका संख्यात्मक मान मेरे डेटाबेस में संग्रहीत है। मैं एक datagrid में इस मान को प्रदर्शित करता हूं।

<asp:boundcolumn datafield="ControlSelectionTypeId" headertext="Control Type"></asp:boundcolumn>

आईडी का मतलब उपयोगकर्ता के लिए कुछ भी नहीं है इसलिए मैंने निम्न के साथ एक टेम्पलेट कॉलम के लिए सीमा को बदल दिया है।

<asp:TemplateColumn>
    <ItemTemplate>
        <%# Enum.Parse(typeof(ControlSelectionType), DataBinder.Eval(Container.DataItem, "ControlSelectionTypeId").ToString()).ToString()%>
    </ItemTemplate>
</asp:TemplateColumn>

यह बहुत बेहतर है ... हालांकि, यह बहुत अच्छा होगा यदि एक साधारण फ़ंक्शन था जिसे मैं कैमल केस द्वारा विभाजित करने के लिए Enum के चारों ओर रख सकता हूं ताकि शब्द डेटाग्रिड में अच्छी तरह से लपेटें।

नोट: मुझे पूरी जानकारी है कि यह सब करने के बेहतर तरीके हैं। इस स्क्रीन को पूरी तरह से आंतरिक रूप से उपयोग किया जाता है और मैं इसे थोड़ा बेहतर प्रदर्शित करने के लिए बस एक त्वरित हैक चाहता हूं।

जवाबों:


76

वास्तव में एक रेगीक्स / रिप्लेस अन्य उत्तर में वर्णित तरीके से जाने का तरीका है, हालाँकि यह आपके लिए भी उपयोगी हो सकता है यदि आप एक अलग दिशा में जाना चाहते हैं

    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();
    }

यह आपको अपने Enums को परिभाषित करने की अनुमति देगा

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

से लिया गया

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


+1 महान जवाब, मैं शायद नियमित अभिव्यक्ति उत्तर का उपयोग करूंगा क्योंकि यह तेज और आसान है, हालांकि, यह एक बेहतर समाधान है और इसलिए इसे स्वीकार किया जाता है।
रॉबिन डे

मैंने एनम विशेषताओं पर कई उत्तर देखे हैं, लेकिन यह सबसे साफ दिखता है!
नवफाल

2
चालाक, लेकिन यह एक साधारण स्टेटगेक्स फ़ंक्शन की तुलना में बहुत अधिक काम है। मुझे यकीन नहीं है कि मैं "सबसे साफ" या "तेज" या "आसान" से सहमत हूं। चतुर? पक्का।
टॉड पेनटन

1
यह केवल तभी काम करता है जब आपका उस एनम पर नियंत्रण होता है, लेकिन मैं यह मानने के बजाय प्रदर्शन कोड पर पूर्ण नियंत्रण रखता हूं कि एनम के मूल्यों का पूरी तरह से पालन किया जाएगा।
बेरिन लोरिट्श

131

मैंनें इस्तेमाल किया:

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

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

ऊंट केस भाग को पूरा करने का सरल तरीका ... अन्य दृष्टिकोण अधिक अनुकूलन के लिए बेहतर है। धन्यवाद @ टिलिटो
13:30

62
मैंने नियमित अभिव्यक्ति को "(? <= [Az])] ([AZ])" के रूप में बदल दिया। ProductID के परिणाम में Product I के बजाय Product ID में परिवर्तित किया जा रहा है। यह निर्दिष्ट करता है कि ऊपरी केस लेटर को निम्न केस लेटर से पहले होना चाहिए (लुकअप ऑपरेटर को नोट करें)। यह ट्रिम की आवश्यकता को भी समाप्त करता है।
बेन मिल्स

7
हे बेन, तुम एक जवाब के रूप में क्यों नहीं डालते। एक अलग (और अधिक परिष्कृत) regex होने से एक नया उत्तर प्राप्त होता है!
निकोलस पीटरसन

3
बेन की सहायक टिप्पणी के अतिरिक्त, मुझे यह उल्लेख करना चाहिए कि आप नियमित अभिव्यक्ति का उपयोग करके "हेल्लो वर्ल्ड" में "हेलोवर्ल्ड" जैसी कुछ भी विभाजित कर सकते हैं: (? <? [AZ]) ([AZ]) (? = [Az] )
ग्यांगरोलो

6
मैंने बेन मिल्स और ग्यांगुरोलो के भावों को जोड़ दिया: Regex.Replace (इनपुट, @ "((<= [AZ]) ([AZ]) (? = [Az])) | ((? <= [Az + +)] ((AZ])) ", @" $ 0 ", RegexOptions.Compiled) .Trim ();
आइसवर्यर 353

23

इस रेगेक्स (^[a-z]+|[A-Z]+(?![a-z])|[A-Z][a-z]+)का उपयोग कैमलकेस या पास्कलकेस नाम से सभी शब्दों को निकालने के लिए किया जा सकता है। यह नाम के अंदर कहीं भी संक्षिप्त रूप में काम करता है।

  • MyHTTPServerवास्तव में 3 मैचों में शामिल होंगे: My, HTTP,Server
  • myNewXMLFile4 मैचों में शामिल होंगे: my, New, XML,File

आप तब उन्हें एक स्ट्रिंग में शामिल कर सकते हैं 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);

2
मुझें यह पसंद है। हालांकि, हम आधुनिक समय में रहते हैं। इसलिए: @"(^\p{Ll}+|\p{Lu}+(?!\p{Ll})|\p{Lu}\p{Ll}+)"यह नोट करना भी महत्वपूर्ण है कि यह संख्या बिल्कुल भी नहीं करेगा, भले ही वे पहचानकर्ताओं में मान्य हों।
डैनियल बी

सरल अभी तक सही!
जेसी राजा

1
मुझे "(^ [az] +] [[az] + ((! Az]) [[az]] [az] + | [0-9 \ _। *] + | [Az] +)" "ITPortfolio12v2.0.13BMS" में परिणाम "IT पोर्टफोलियो 12 v 2.0.13 BMS" किसी को hth
जो जॉन्सटन

15

यदि C # 3.0 एक विकल्प है, तो आप कार्य करने के लिए निम्नलिखित एक-लाइनर का उपयोग कर सकते हैं:


Regex.Matches(YOUR_ENUM_VALUE_NAME, "[A-Z][a-z]+").OfType<Match>().Select(match => match.Value).Aggregate((acc, b) => acc + " " + b).TrimStart(' ');

1
यह AMACharter जैसे पाठ में Acroynms को संभालता नहीं है, 'चार्टर' को 'AMA चार्टर' नहीं देता है।
एडम मिल्स

हालांकि इस तरह के मामले को संभालने के लिए संशोधन आसान होंगे (कुछ (जैसे [AZ] *) और कोड को थोड़ा संशोधित करने के बारे में सोचें), जो मुझे माइक्रोसॉफ्ट के कोडिंग दिशानिर्देशों से याद है, ऐसे सभी-कैप्स के उपयोग से हतोत्साहित किया गया है, और यदि सभी 2 अक्षरों से अधिक लंबे समय तक सम-कैप्स वाले सामान्य योग से बचा जाना चाहिए।
एमकॉम

1
मेरे लिए काम नहीं करता है। "कैमलकेस" "कैमल" बन जाता है न कि "कैमल केस"।
टिलिटो

15

टिलिटो का जवाब पहले से मौजूद रिक्त स्थान को संभालना नहीं है, या परिवर्णी है। यह इसे ठीक करता है:

public static string SplitCamelCase(string input)
{
    return Regex.Replace(input, "(?<=[a-z])([A-Z])", " $1", RegexOptions.Compiled);
}

डिस्क्लेमर: क्रेडिट मूल उत्तर के प्रदाता टिलिटो और बेन मिल्स को जाता है, जिन्होंने एक टिप्पणी में सुधार का सुझाव दिया था। चूंकि यह एक बेहतर उत्तर है और उनमें से किसी ने भी इसे पोस्ट या संपादित नहीं किया है, इसलिए यह एक अलग उत्तर का हकदार है। अगर मुझे टिप्पणियों के तहत इसे शुरू करने के लिए दफन नहीं किया गया था, तो मुझे आधे घंटे की डिबगिंग से बचाया होगा।
पेट्रिसियो

2
सरल परीक्षण के मामले में "SMSMessage" (अपेक्षित: "SMS संदेश", वास्तविक: "SMSMessage") विफल रहता है।
इयान केम्प

10

यहाँ एक विस्तार विधि है जो संख्या और एकाधिक अपरकेस वर्णों को पूरी तरह से संभालती है, और अंतिम स्ट्रिंग में ऊपरी आवरण विशिष्ट समरूपता के लिए भी अनुमति देता है:

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
{
    /// <summary>
    /// Extension methods for the string data type
    /// </summary>
    public static class ConventionBasedFormattingExtensions
    {
        /// <summary>
        /// Turn CamelCaseText into Camel Case Text.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        /// <remarks>Use AppSettings["SplitCamelCase_AllCapsWords"] to specify a comma-delimited list of words that should be ALL CAPS after split</remarks>
        /// <example>
        /// 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
        /// </example>
        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<string, Regex> _SplitCamelCase_AllCapsWords_Regexes;
        private static Dictionary<string, Regex> SplitCamelCase_AllCapsWords_Regexes
        {
            get
            {
                if (_SplitCamelCase_AllCapsWords_Regexes == null)
                {
                    _SplitCamelCase_AllCapsWords_Regexes = new Dictionary<string,Regex>();
                    foreach(var word in _SplitCamelCase_AllCapsWords)
                        _SplitCamelCase_AllCapsWords_Regexes.Add(word, new Regex(@"\b" + word + @"\b", RegexOptions.Compiled | RegexOptions.IgnoreCase));
                }

                return _SplitCamelCase_AllCapsWords_Regexes;
            }
        }
    }
}

6

आप C # एक्सटेंशन विधियों का उपयोग कर सकते हैं

        public static string SpacesFromCamel(this string value)
        {
            if (value.Length > 0)
            {
                var result = new List<char>();
                char[] array = value.ToCharArray();
                foreach (var item in array)
                {
                    if (char.IsUpper(item) && result.Count > 0)
                    {
                        result.Add(' ');
                    }
                    result.Add(item);
                }

                return new string(result.ToArray());
            }
            return value;
        }

फिर आप इसका उपयोग कर सकते हैं

var result = "TestString".SpacesFromCamel();

रिजल्ट होगा

परीक्षण स्ट्रिंग


1
यह वास्तव में शुरुआत में एक स्थान बनाता है, कोड तय किया
मार्टिन ज़िकमुंड

3

मेरे पास भी है enumजो मुझे अलग करना पड़ा। मेरे मामले में इस पद्धति से समस्या हल हो गई-

string SeparateCamelCase(string str)
{
    for (int i = 1; i < str.Length; i++)
    {
        if (char.IsUpper(str[i]))
        {
            str = str.Insert(i, " ");
            i++;
        }
    }
    return str;
}

2

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()));

1
आपको C \ C ++ के साथ कोडिंग पर वापस जाना चाहिए: D # के लिए बहुत गंदा रास्ता #
डेटा

1
वैसे मैंने कहा था कि यह एक त्वरित और गंदा हैक था। यहाँ एक क्लीनर LINQ संस्करण है।
एंडी रोज

यह AMACharter जैसे पाठ में Acroynms को नहीं संभालता है, 'AMA चार्टर' नहीं 'AMA चार्टर
एडम मिल्स

2
public enum ControlSelectionType    
{   
    NotApplicable = 1,   
    SingleSelectRadioButtons = 2,   
    SingleSelectDropDownList = 3,   
    MultiSelectCheckBox = 4,   
    MultiSelectListBox = 5   
} 
public class NameValue
{
    public string Name { get; set; }
    public object Value { get; set; }
}    
public static List<NameValue> EnumToList<T>(bool camelcase)
        {
            var array = (T[])(Enum.GetValues(typeof(T)).Cast<T>()); 
            var array2 = Enum.GetNames(typeof(T)).ToArray<string>(); 
            List<NameValue> lst = null;
            for (int i = 0; i < array.Length; i++)
            {
                if (lst == null)
                    lst = new List<NameValue>();
                string name = "";
                if (camelcase)
                {
                    name = array2[i].CamelCaseFriendly();
                }
                else
                    name = array2[i];
                T value = array[i];
                lst.Add(new NameValue { Name = name, Value = value });
            }
            return lst;
        }
        public static string CamelCaseFriendly(this string pascalCaseString)
        {
            Regex r = new Regex("(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])");
            return r.Replace(pascalCaseString, " ${x}");
        }

//In  your form 
protected void Button1_Click1(object sender, EventArgs e)
        {
            DropDownList1.DataSource = GeneralClass.EnumToList<ControlSelectionType  >(true); ;
            DropDownList1.DataTextField = "Name";
            DropDownList1.DataValueField = "Value";

            DropDownList1.DataBind();
        }

2

इओन कैंपबेल से समाधान अच्छा काम करता है, सिवाय अगर आपके पास एक वेब सेवा है।

आपको निम्नलिखित करने की आवश्यकता होगी क्योंकि विवरण विशेषता क्रमबद्ध नहीं है।

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


public static string GetDescriptionFromEnumValue(Enum value)
{
    EnumMemberAttribute attribute = value.GetType()
        .GetField(value.ToString())
        .GetCustomAttributes(typeof(EnumMemberAttribute), false)
        .SingleOrDefault() as EnumMemberAttribute;
    return attribute == null ? value.ToString() : attribute.Value;
}

2

और यदि आप regex का उपयोग करके कल्पना नहीं करते हैं - तो यह कोशिश करें:

public static string SeperateByCamelCase(this string text, char splitChar = ' ') {

        var output = new StringBuilder();

        for (int i = 0; i < text.Length; i++)
        {
            var c = text[i];

            //if not the first and the char is upper
            if (i > 0 && char.IsUpper(c)) {

                var wasLastLower = char.IsLower(text[i - 1]);

                if (i + 1 < text.Length) //is there a next
                {
                    var isNextUpper = char.IsUpper(text[i + 1]);

                    if (!isNextUpper) //if next is not upper (start of a word).
                    {
                        output.Append(splitChar);
                    }
                    else if (wasLastLower) //last was lower but i'm upper and my next is an upper (start of an achromin). 'abcdHTTP' 'abcd HTTP'
                    {
                        output.Append(splitChar);
                    }
                }
                else
                {
                    //last letter - if its upper and the last letter was lower 'abcd' to 'abcd A'
                    if (wasLastLower)
                    {
                        output.Append(splitChar);
                    }
                }
            }

            output.Append(c);
        }


        return output.ToString();

    }

इन परीक्षणों को पास करता है, यह संख्याओं को पसंद नहीं करता है, लेकिन मुझे इसकी आवश्यकता नहीं थी।

    [TestMethod()]
    public void ToCamelCaseTest()
    {

        var testData = new string[] { "AAACamel", "AAA", "SplitThisByCamel", "AnA", "doesnothing", "a", "A", "aasdasdAAA" };
        var expectedData = new string[] { "AAA Camel", "AAA", "Split This By Camel", "An A", "doesnothing", "a", "A", "aasdasd AAA" };

        for (int i = 0; i < testData.Length; i++)
        {
            var actual = testData[i].SeperateByCamelCase();
            var expected = expectedData[i];
            Assert.AreEqual(actual, expected);
        }

    }

2

#JustSayNoToRegex

Uderscores और संख्याओं के साथ एक C # पहचानकर्ता लेता है, और इसे अंतरिक्ष-पृथक स्ट्रिंग में परिवर्तित करता है।

public static class StringExtensions
{
    public static string SplitOnCase(this string identifier)
    {
        if (identifier == null || identifier.Length == 0) return string.Empty;
        var sb = new StringBuilder();

        if (identifier.Length == 1) sb.Append(char.ToUpperInvariant(identifier[0]));

        else if (identifier.Length == 2) sb.Append(char.ToUpperInvariant(identifier[0])).Append(identifier[1]);

        else {
            if (identifier[0] != '_') sb.Append(char.ToUpperInvariant(identifier[0]));
            for (int i = 1; i < identifier.Length; i++) {
                var current = identifier[i];
                var previous = identifier[i - 1];

                if (current == '_' && previous == '_') continue;

                else if (current == '_') {
                    sb.Append(' ');
                }

                else if (char.IsLetter(current) && previous == '_') {
                    sb.Append(char.ToUpperInvariant(current));
                }

                else if (char.IsDigit(current) && char.IsLetter(previous)) {
                    sb.Append(' ').Append(current);
                }

                else if (char.IsLetter(current) && char.IsDigit(previous)) {
                    sb.Append(' ').Append(char.ToUpperInvariant(current));
                }

                else if (char.IsUpper(current) && char.IsLower(previous) 
                    && (i < identifier.Length - 1 && char.IsUpper(identifier[i + 1]) || i == identifier.Length - 1)) {
                        sb.Append(' ').Append(current);
                }

                else if (char.IsUpper(current) && i < identifier.Length - 1 && char.IsLower(identifier[i + 1])) {
                    sb.Append(' ').Append(current);
                }

                else {
                    sb.Append(current);
                }
            }
        }
        return sb.ToString();
    }

}

टेस्ट:

[TestFixture]
static class HelpersTests
{
    [Test]
    public static void Basic()
    {
        Assert.AreEqual("Foo", "foo".SplitOnCase());
        Assert.AreEqual("Foo", "_foo".SplitOnCase());
        Assert.AreEqual("Foo", "__foo".SplitOnCase());
        Assert.AreEqual("Foo", "___foo".SplitOnCase());
        Assert.AreEqual("Foo 2", "foo2".SplitOnCase());
        Assert.AreEqual("Foo 23", "foo23".SplitOnCase());
        Assert.AreEqual("Foo 23 A", "foo23A".SplitOnCase());
        Assert.AreEqual("Foo 23 Ab", "foo23Ab".SplitOnCase());
        Assert.AreEqual("Foo 23 Ab", "foo23_ab".SplitOnCase());
        Assert.AreEqual("Foo 23 Ab", "foo23___ab".SplitOnCase());
        Assert.AreEqual("Foo 23", "foo__23".SplitOnCase());
        Assert.AreEqual("Foo Bar", "Foo_bar".SplitOnCase());
        Assert.AreEqual("Foo Bar", "Foo____bar".SplitOnCase());
        Assert.AreEqual("AAA", "AAA".SplitOnCase());
        Assert.AreEqual("Foo A Aa", "fooAAa".SplitOnCase());
        Assert.AreEqual("Foo AAA", "fooAAA".SplitOnCase());
        Assert.AreEqual("Foo Bar", "FooBar".SplitOnCase());
        Assert.AreEqual("Mn M", "MnM".SplitOnCase());
        Assert.AreEqual("AS", "aS".SplitOnCase());
        Assert.AreEqual("As", "as".SplitOnCase());
        Assert.AreEqual("A", "a".SplitOnCase());
        Assert.AreEqual("_", "_".SplitOnCase());

    }
}

1

उपरोक्त में से कुछ के समान सरल संस्करण, लेकिन विभाजक को ऑटो-इंसर्ट न करने के तर्क के साथ (जो कि डिफ़ॉल्ट रूप से, एक स्थान है, लेकिन कोई भी चार्ट हो सकता है) यदि वर्तमान स्थिति में पहले से ही एक है।

StringBuilderA म्यूटिंग ’तार के बजाय उपयोग करता है ।

public static string SeparateCamelCase(this string value, char separator = ' ') {

    var sb = new StringBuilder();
    var lastChar = separator;

    foreach (var currentChar in value) {

        if (char.IsUpper(currentChar) && lastChar != separator)
            sb.Append(separator);

        sb.Append(currentChar);

        lastChar = currentChar;
    }

    return sb.ToString();
}

उदाहरण:

Input  : 'ThisIsATest'
Output : 'This Is A Test'

Input  : 'This IsATest'
Output : 'This Is A Test' (Note: Still only one space between 'This' and 'Is')

Input  : 'ThisIsATest' (with separator '_')
Output : 'This_Is_A_Test'

0

इसे इस्तेमाल करे:

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';
    }
}

ऑनलाइन नमूना देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.