.NET - আপনি কীভাবে একটি "ক্যাপস" সীমাবদ্ধ স্ট্রিংটিকে অ্যারেতে বিভক্ত করতে পারেন?


114

আমি এই স্ট্রিং থেকে কীভাবে যাব: "এইআইএসমাইক্যাপস ডিজিলিট স্ট্রিং"

... এই স্ট্রিংয়ে: "এটি আমার ক্যাপস ডিলিমিট স্ট্রিং"

ভিবিএনটিতে কোডের সর্বাপেক্ষা লাইন পছন্দ করা হলেও সি # এটিও স্বাগত।

চিয়ার্স!


1
"ওল্ডম্যাকডোনাল্ডঅ্যান্ডম্রো'টুলিওন্টটোম্যাকডোনাল্ডস" যখন আপনাকে মোকাবেলা করতে হবে তখন কী হবে?
— গ্রান্ট ওয়াগনার

2
এটি কেবল সীমিত ব্যবহার দেখতে পাচ্ছে। আমি কেবল এটি ব্যবহার করতে যাচ্ছি চলক নামগুলি যেমন এই আইএসএমএসপেশিয়াল ভেরিয়েবল,
— নিনো

এটি আমার জন্য কাজ করেন: Regex.Replace(s, "([A-Z0-9]+)", " $1").Trim()। এবং আপনি যদি প্রতিটি মূলধনীতে আলাদা করতে চান তবে কেবল যোগটি সরিয়ে দিন।
— ম্লাদেন বি।

উত্তর:


173

আমি এটি কিছুক্ষণ আগে তৈরি করেছি। এটি একটি ক্যামেলকেসের নামের প্রতিটি অংশের সাথে মেলে।

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

উদাহরণ স্বরূপ:

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

শব্দের মধ্যে ফাঁকা স্থান সন্নিবেশ করানোর জন্য এটি রূপান্তর করতে:

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

আপনার যদি অঙ্কগুলি পরিচালনা করতে হয়:

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

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

1
ক্যামেলকেস! এটাকেই বলা হত! আমি এটা ভালোবাসি! অনেক ধন্যবাদ!
— মাতিয়াস নিনো

19
আসলে উটকেসের একটি ছোট ছোট অক্ষর আছে। আপনি এখানে যা উল্লেখ করছেন তা হ'ল পাস্কেলকেস।
— ড্রয় নোকস

12
... এবং আপনি যখন এমন কোনও কিছু উল্লেখ করেন যা "উটের কেস" বা "পাস্কেল কেস" হতে পারে তখন তাকে "আন্তঃবিড়িত" বলা হয়
— ক্রিস

"টেক 5" কে বিভক্ত করবেন না যা আমার ব্যবহারের ক্ষেত্রে ব্যর্থ হবে
— পান্ডুড

1
@ পান্ডাওড ডিজিটস প্রশ্নটিতে ছিল না, সুতরাং আমার উত্তর তাদের জন্য দায়ী হয়নি। আমি অঙ্কগুলির জন্য যে নিদর্শনগুলির একটি বৈকল্পিক যুক্ত করেছি।
— মার্কাস জারদারোট

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

এটি এখন পর্যন্ত সেরা সমাধান, তবে আপনাকে সংকলনের জন্য \\ B ব্যবহার করা দরকার। অন্যথায় সংকলক \ বিটিকে একটি পালানোর ক্রম হিসাবে বিবেচনা করার চেষ্টা করে।
— ফেরুক্সিও

সুন্দর সমাধান। কেউ কি কোনও কারণ চিন্তা করতে পারেন যে এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়? এটি কম সক্ষম বা কম অভিনয়?
— ড্রয় নোকস

8
এটি একটিতে পর পরের ক্যাপগুলি পৃথক শব্দ হিসাবে বিবেচনা করে (যেমন এএনজ্যাক 5 টি শব্দ) যেখানে মিজার্ডএক্স এর উত্তর হিসাবে এটি (সঠিকভাবে আইএমএইচও) এক শব্দ হিসাবে বিবেচনা করে।
— রায়

2
@ রে, আমি যুক্তি দিয়েছিলাম যে "এএনজেএসি" কে "আনজ্যাক" হিসাবে একটি প্যাসিকাল কেস শব্দ হিসাবে বিবেচনা করা উচিত, কারণ এটি ইংরেজি-কেস নয়।
— স্যাম

1
@ নিওক্স, ইংরেজিতে এটি হওয়া উচিত, তবে এটি সংক্ষিপ্ত আকার বা সাধারণ-ইংলিশ-ক্ষেত্রে নয়; এটি ক্যাপস-সীমাবদ্ধ। যদি উত্স পাঠ্যটি একইভাবে সাধারণ ইংরেজিতে মূলধন করা হয় তবে অন্য বর্ণগুলিও মূলধনীয় হওয়া উচিত নয়। উদাহরণস্বরূপ, ক্যাপস-সীমাবদ্ধ বিন্যাসে ফিট করার জন্য "আই" ইন "কেন" এএনজেএসি "তে" এনজেডএসি "নয়? কড়া কথায় বলতে গেলে, যদি আপনি "এএনজেএসি" কে ক্যাপ-সীমিত হিসাবে ব্যাখ্যা করেন তবে এটি 5 টি শব্দ, প্রতিটি অক্ষরের জন্য একটি করে।
— স্যাম

19

দুর্দান্ত উত্তর, মিজার্ডএক্স! অঙ্কগুলিকে পৃথক শব্দ হিসাবে বিবেচনা করার জন্য আমি এটি সামান্য ট্যুইক করেছি, যাতে "অ্যাড্রেসলাইন 1" "ঠিকানা লাইন 1" এর পরিবর্তে "ঠিকানা লাইন 1" হয়ে যায়:

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

2
দুর্দান্ত সংযোজন! আমি সন্দেহ করি যে স্বল্প সংখ্যক গ্রহণযোগ্য উত্তরের উত্তরগুলি হ্যান্ডলিং করে কয়েক জন অবাক হবেন না। :)
— জর্দান গ্রে

আমি জানি আপনি এটি পোস্ট করার পরে প্রায় 8 বছর হয়ে গেছে, তবে এটি আমার জন্যও পুরোপুরি কার্যকর হয়েছিল। :) সংখ্যাগুলি আমাকে প্রথমে ছড়িয়ে দিয়েছে।
— মাইকেল আর্মেস

আমার 2 আউটলেট পরীক্ষায় উত্তীর্ণ একমাত্র উত্তর: "টেক 5" -> "5 নিন", "প্রকাশক আইডি" -> "প্রকাশক আইডি"। আমি এটিকে দুবার উপস্থাপন করতে চাই
— পান্ডাওয়ুড

18

কিছুটা বৈচিত্র্যের জন্য ... এখানে একটি এক্সটেনশন পদ্ধতি যা একটি রেইগেক্স ব্যবহার করে না।

public static class CamelSpaceExtensions
{
    public static string SpaceCamelCase(this String input)
    {
        return new string(Enumerable.Concat(
            input.Take(1), // No space before initial cap
            InsertSpacesBeforeCaps(input.Skip(1))
        ).ToArray());
    }

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

            yield return c;
        }
    }
}

ট্রিম () ব্যবহার এড়াতে, পূর্বাভাসের আগে আমি রেখেছি: int কাউন্টার = -1। ভিতরে, কাউন্টার ++ যোগ করুন। চেকটি এতে পরিবর্তন করুন: যদি (char.IsUpper (c) && counter> 0)
— বক্স ডেভেলপার বাইরে

এটি 1 ম চরের আগে একটি স্থান সন্নিবেশ করায়।
— জার শারদান

@ জারশারদান দ্বারা নির্দেশিত সমস্যাটি সমাধানের স্বাধীনতা আমি নিয়েছি। আপনি যদি পরিবর্তনটি অপছন্দ করেন তবে নির্দ্বিধায় ফিরে যেতে বা আপনার নিজের ফিক্সে সম্পাদনা করুন।
— jpmc26

উদাহরণস্বরূপ, বড় হাতের অক্ষরের একটি সিরিজে শেষ বড় হাতের আগে একটি স্থান যুক্ত করে সংক্ষেপণগুলি হ্যান্ডেল করার জন্য এটি কী বাড়ানো যেতে পারে যেমন BOEForecast => BOE পূর্বাভাস
— নেপালজ

11

গ্রান্ট ওয়াগনারের দুর্দান্ত মন্তব্যটি একদিকে রাখুন:

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

ভাল কথা ... দয়া করে আপনার পছন্দের .substring (), .trimstart (), .trim (), .reove (), ইত্যাদি সন্নিবেশ করান :)
— সিউডো মাসোচিস্ট

9

আমার একটি সমাধান দরকার যা সংক্ষিপ্ত নাম এবং সংখ্যাগুলিকে সমর্থন করে। এই রেজেক্স-ভিত্তিক সমাধানটি নিম্নলিখিত নিদর্শনগুলিকে পৃথক "শব্দ" হিসাবে গণ্য করে:

  • ছোট হাতের অক্ষরগুলির পরে একটি মূল অক্ষর
  • একটানা সংখ্যার ক্রম
  • একটানা বড় বড় অক্ষর (সংক্ষিপ্ত নাম হিসাবে ব্যাখ্যা করা) - একটি নতুন শব্দ শেষ রাজধানী যেমন HTMLGuide => "এইচটিএমএল গাইড", "থিয়েটিয়াম" => "দ্য দল" ব্যবহার করে শুরু হতে পারে

আপনি এটি ওয়ান-লাইনার হিসাবে করতে পারেন:

Regex.Replace(value, @"(?<!^)((?<!\d)\d|(?(?<=[A-Z])[A-Z](?=[a-z])|[A-Z]))", " $1")

আরও পঠনযোগ্য পদ্ধতি আরও ভাল হতে পারে:

using System.Text.RegularExpressions;

namespace Demo
{
    public class IntercappedStringHelper
    {
        private static readonly Regex SeparatorRegex;

        static IntercappedStringHelper()
        {
            const string pattern = @"
                (?<!^) # Not start
                (
                    # Digit, not preceded by another digit
                    (?<!\d)\d 
                    |
                    # Upper-case letter, followed by lower-case letter if
                    # preceded by another upper-case letter, e.g. 'G' in HTMLGuide
                    (?(?<=[A-Z])[A-Z](?=[a-z])|[A-Z])
                )";

            var options = RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled;

            SeparatorRegex = new Regex(pattern, options);
        }

        public static string SeparateWords(string value, string separator = " ")
        {
            return SeparatorRegex.Replace(value, separator + "$1");
        }
    }
}

(XUnit) পরীক্ষাগুলি থেকে এখানে একটি নির্যাস দেওয়া হয়েছে:

[Theory]
[InlineData("PurchaseOrders", "Purchase-Orders")]
[InlineData("purchaseOrders", "purchase-Orders")]
[InlineData("2Unlimited", "2-Unlimited")]
[InlineData("The2Unlimited", "The-2-Unlimited")]
[InlineData("Unlimited2", "Unlimited-2")]
[InlineData("222Unlimited", "222-Unlimited")]
[InlineData("The222Unlimited", "The-222-Unlimited")]
[InlineData("Unlimited222", "Unlimited-222")]
[InlineData("ATeam", "A-Team")]
[InlineData("TheATeam", "The-A-Team")]
[InlineData("TeamA", "Team-A")]
[InlineData("HTMLGuide", "HTML-Guide")]
[InlineData("TheHTMLGuide", "The-HTML-Guide")]
[InlineData("TheGuideToHTML", "The-Guide-To-HTML")]
[InlineData("HTMLGuide5", "HTML-Guide-5")]
[InlineData("TheHTML5Guide", "The-HTML-5-Guide")]
[InlineData("TheGuideToHTML5", "The-Guide-To-HTML-5")]
[InlineData("TheUKAllStars", "The-UK-All-Stars")]
[InlineData("AllStarsUK", "All-Stars-UK")]
[InlineData("UKAllStars", "UK-All-Stars")]

1
রেজেক্স ব্যাখ্যা করার জন্য এবং এটি এই পাঠযোগ্য making এবং আমি নতুন কিছু শিখেছি। .NET Regex এ একটি ফ্রি-স্পেসিং মোড এবং মন্তব্য রয়েছে। ধন্যবাদ!
— ফেলিক্স কেয়েল

4

আরও বিভিন্ন ধরণের জন্য, সাদামাটা পুরানো সি # অবজেক্ট ব্যবহার করে, নিম্নলিখিতটি @ মিজার্ডএক্সের দুর্দান্ত নিয়মিত এক্সপ্রেশন হিসাবে একই আউটপুট উত্পাদন করে।

public string FromCamelCase(string camel)
{   // omitted checking camel for null
    StringBuilder sb = new StringBuilder();
    int upperCaseRun = 0;
    foreach (char c in camel)
    {   // append a space only if we're not at the start
        // and we're not already in an all caps string.
        if (char.IsUpper(c))
        {
            if (upperCaseRun == 0 && sb.Length != 0)
            {
                sb.Append(' ');
            }
            upperCaseRun++;
        }
        else if( char.IsLower(c) )
        {
            if (upperCaseRun > 1) //The first new word will also be capitalized.
            {
                sb.Insert(sb.Length - 1, ' ');
            }
            upperCaseRun = 0;
        }
        else
        {
            upperCaseRun = 0;
        }
        sb.Append(c);
    }

    return sb.ToString();
}

2
বাহ, এটা কুরুচিপূর্ণ। এখন আমার মনে আছে কেন আমি খুব প্রিয়ভাবে রেগেজকে ভালবাসি! চেষ্টা করার জন্য +1, যদিও। ;)
— মার্ক বন্ধনী

3

নীচে একটি প্রোটোটাইপ যা নিম্নলিখিতগুলি শিরোনাম কেসে রূপান্তরিত করে:

  • snake_case
  • ক্যামেলকেস
  • PascalCase
  • বাক্য ক্ষেত্রে
  • শিরোনাম কেস (বর্তমান ফর্ম্যাটিং রাখুন)

স্পষ্টতই আপনার নিজের "টাইটিটালকেস" পদ্ধতিটি কেবল নিজের প্রয়োজন হবে।

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        var examples = new List<string> { 
            "THEQuickBrownFox",
            "theQUICKBrownFox",
            "TheQuickBrownFOX",
            "TheQuickBrownFox",
            "the_quick_brown_fox",
            "theFOX",
            "FOX",
            "QUICK"
        };

        foreach (var example in examples)
        {
            Console.WriteLine(ToTitleCase(example));
        }
    }

    private static string ToTitleCase(string example)
    {
        var fromSnakeCase = example.Replace("_", " ");
        var lowerToUpper = Regex.Replace(fromSnakeCase, @"(\p{Ll})(\p{Lu})", "$1 $2");
        var sentenceCase = Regex.Replace(lowerToUpper, @"(\p{Lu}+)(\p{Lu}\p{Ll})", "$1 $2");
        return new CultureInfo("en-US", false).TextInfo.ToTitleCase(sentenceCase);
    }
}

কনসোলটি নীচে থাকবে:

THE Quick Brown Fox
The QUICK Brown Fox
The Quick Brown FOX
The Quick Brown Fox
The Quick Brown Fox
The FOX
FOX
QUICK

ব্লগ পোস্ট রেফারেন্সড


2
string s = "ThisIsMyCapsDelimitedString";
string t = Regex.Replace(s, "([A-Z])", " $1").Substring(1);

আমি জানতাম একটি সহজ রেজিএক্স উপায় থাকবে ... আমি আরও এটি ব্যবহার শুরু করব।
— ম্যাক্স শেমলিং

1
একজন রেজেক্স গুরু নয় তবে "হেরেসএডাব্লুএফটিএসটিং" এর সাথে কী ঘটে?
— নিক 22

1
আপনি "হেরেস এডাব্লুটিএফ স্ট্রিং" পেয়েছেন তবে মাটিয়াস নিনো প্রশ্নটিতে ঠিক তাই চেয়েছিল।
— ম্যাক্স শেমলিং

হ্যাঁ তাকে যুক্ত করতে হবে "একাধিক সংলগ্ন রাজধানীগুলি একা রয়েছে"। যা বেশ কয়েকটি ক্ষেত্রে স্পষ্টতই প্রয়োজনীয় is যেমন "পাবলিশারআইডি" এখানে "প্রকাশক আই ডি" তে যায় যা ভয়াবহ
— পান্ডাউড

2

রেগেক্স সাধারণ লুপের চেয়ে প্রায় 10-12 গুণ কম ধীর:

    public static string CamelCaseToSpaceSeparated(this string str)
    {
        if (string.IsNullOrEmpty(str))
        {
            return str;
        }

        var res = new StringBuilder();

        res.Append(str[0]);
        for (var i = 1; i < str.Length; i++)
        {
            if (char.IsUpper(str[i]))
            {
                res.Append(' ');
            }
            res.Append(str[i]);

        }
        return res.ToString();
    }

1

নিষ্পাপ রেজেক্স সমাধান ও'কনারকে পরিচালনা করবে না এবং স্ট্রিংয়ের শুরুতে একটি স্থান যুক্ত করবে।

s = "ThisIsMyCapsDelimitedString"
split = Regex.Replace(s, "[A-Z0-9]", " $&");

আমি আপনাকে মোডেড করেছি, তবে লোকেরা সাধারণত "স্মোক" দিয়ে শুরু না হলে স্ম্যাকডাউন আরও ভাল করে নেয়।
— মুসিজেনেসিস

আমি মনে করি না যে এটি একটি স্ম্যাকডাউন ছিল। এই প্রসঙ্গে, নিষ্পাপের অর্থ সাধারণত স্পষ্ট বা সরল (অর্থাত্ সর্বোত্তম সমাধানের প্রয়োজন হয় না)। অবমাননার কোনও উদ্দেশ্য নেই।
— ফেরুকসিও

0

সম্ভবত আরও মার্জিত সমাধান আছে, তবে এটিই আমি আমার মাথার উপরের অংশটি নিয়ে এসেছি:

string myString = "ThisIsMyCapsDelimitedString";

for (int i = 1; i < myString.Length; i++)
{
     if (myString[i].ToString().ToUpper() == myString[i].ToString())
     {
          myString = myString.Insert(i, " ");
          i++;
     }
}

0

ব্যবহার করার চেষ্টা করুন

"([A-Z]*[^A-Z]*)"

সংখ্যা সংখ্যার সাথে বর্ণমালা মিশ্রণের জন্য উপযুক্ত হবে

Regex.Replace("AbcDefGH123Weh", "([A-Z]*[^A-Z]*)", "$1 ");
Abc Def GH123 Weh  

Regex.Replace("camelCase", "([A-Z]*[^A-Z]*)", "$1 ");
camel Case  

0

Psudo কোডটি প্রয়োগ করছে: https://stackoverflow.com/a/5796394/4279201

    private static StringBuilder camelCaseToRegular(string i_String)
    {
        StringBuilder output = new StringBuilder();
        int i = 0;
        foreach (char character in i_String)
        {
            if (character <= 'Z' && character >= 'A' && i > 0)
            {
                output.Append(" ");
            }
            output.Append(character);
            i++;
        }
        return output;
    }


0

পদ্ধতিগত এবং দ্রুত প্ররোচনা:

  /// <summary>
  /// Get the words in a code <paramref name="identifier"/>.
  /// </summary>
  /// <param name="identifier">The code <paramref name="identifier"/></param> to extract words from.
  public static string[] GetWords(this string identifier) {
     Contract.Ensures(Contract.Result<string[]>() != null, "returned array of string is not null but can be empty");
     if (identifier == null) { return new string[0]; }
     if (identifier.Length == 0) { return new string[0]; }

     const int MIN_WORD_LENGTH = 2;  //  Ignore one letter or one digit words

     var length = identifier.Length;
     var list = new List<string>(1 + length/2); // Set capacity, not possible more words since we discard one char words
     var sb = new StringBuilder();
     CharKind cKindCurrent = GetCharKind(identifier[0]); // length is not zero here
     CharKind cKindNext = length == 1 ? CharKind.End : GetCharKind(identifier[1]);

     for (var i = 0; i < length; i++) {
        var c = identifier[i];
        CharKind cKindNextNext = (i >= length - 2) ? CharKind.End : GetCharKind(identifier[i + 2]);

        // Process cKindCurrent
        switch (cKindCurrent) {
           case CharKind.Digit:
           case CharKind.LowerCaseLetter:
              sb.Append(c); // Append digit or lowerCaseLetter to sb
              if (cKindNext == CharKind.UpperCaseLetter) {
                 goto TURN_SB_INTO_WORD; // Finish word if next char is upper
              }
              goto CHAR_PROCESSED;
           case CharKind.Other:
              goto TURN_SB_INTO_WORD;
           default:  // charCurrent is never Start or End
              Debug.Assert(cKindCurrent == CharKind.UpperCaseLetter);
              break;
        }

        // Here cKindCurrent is UpperCaseLetter
        // Append UpperCaseLetter to sb anyway
        sb.Append(c); 

        switch (cKindNext) {
           default:
              goto CHAR_PROCESSED;

           case CharKind.UpperCaseLetter: 
              //  "SimpleHTTPServer"  when we are at 'P' we need to see that NextNext is 'e' to get the word!
              if (cKindNextNext == CharKind.LowerCaseLetter) {
                 goto TURN_SB_INTO_WORD;
              }
              goto CHAR_PROCESSED;

           case CharKind.End:
           case CharKind.Other:
              break; // goto TURN_SB_INTO_WORD;
        }

        //------------------------------------------------

     TURN_SB_INTO_WORD:
        string word = sb.ToString();
        sb.Length = 0;
        if (word.Length >= MIN_WORD_LENGTH) {  
           list.Add(word);
        }

     CHAR_PROCESSED:
        // Shift left for next iteration!
        cKindCurrent = cKindNext;
        cKindNext = cKindNextNext;
     }

     string lastWord = sb.ToString();
     if (lastWord.Length >= MIN_WORD_LENGTH) {
        list.Add(lastWord);
     }
     return list.ToArray();
  }
  private static CharKind GetCharKind(char c) {
     if (char.IsDigit(c)) { return CharKind.Digit; }
     if (char.IsLetter(c)) {
        if (char.IsUpper(c)) { return CharKind.UpperCaseLetter; }
        Debug.Assert(char.IsLower(c));
        return CharKind.LowerCaseLetter;
     }
     return CharKind.Other;
  }
  enum CharKind {
     End, // For end of string
     Digit,
     UpperCaseLetter,
     LowerCaseLetter,
     Other
  }

পরীক্ষা:

  [TestCase((string)null, "")]
  [TestCase("", "")]

  // Ignore one letter or one digit words
  [TestCase("A", "")]
  [TestCase("4", "")]
  [TestCase("_", "")]
  [TestCase("Word_m_Field", "Word Field")]
  [TestCase("Word_4_Field", "Word Field")]

  [TestCase("a4", "a4")]
  [TestCase("ABC", "ABC")]
  [TestCase("abc", "abc")]
  [TestCase("AbCd", "Ab Cd")]
  [TestCase("AbcCde", "Abc Cde")]
  [TestCase("ABCCde", "ABC Cde")]

  [TestCase("Abc42Cde", "Abc42 Cde")]
  [TestCase("Abc42cde", "Abc42cde")]
  [TestCase("ABC42Cde", "ABC42 Cde")]
  [TestCase("42ABC", "42 ABC")]
  [TestCase("42abc", "42abc")]

  [TestCase("abc_cde", "abc cde")]
  [TestCase("Abc_Cde", "Abc Cde")]
  [TestCase("_Abc__Cde_", "Abc Cde")]
  [TestCase("ABC_CDE_FGH", "ABC CDE FGH")]
  [TestCase("ABC CDE FGH", "ABC CDE FGH")] // Should not happend (white char) anything that is not a letter/digit/'_' is considered as a separator
  [TestCase("ABC,CDE;FGH", "ABC CDE FGH")] // Should not happend (,;) anything that is not a letter/digit/'_' is considered as a separator
  [TestCase("abc<cde", "abc cde")]
  [TestCase("abc<>cde", "abc cde")]
  [TestCase("abc<D>cde", "abc cde")]  // Ignore one letter or one digit words
  [TestCase("abc<Da>cde", "abc Da cde")]
  [TestCase("abc<cde>", "abc cde")]

  [TestCase("SimpleHTTPServer", "Simple HTTP Server")]
  [TestCase("SimpleHTTPS2erver", "Simple HTTPS2erver")]
  [TestCase("camelCase", "camel Case")]
  [TestCase("m_Field", "Field")]
  [TestCase("mm_Field", "mm Field")]
  public void Test_GetWords(string identifier, string expectedWordsStr) {
     var expectedWords = expectedWordsStr.Split(' ');
     if (identifier == null || identifier.Length <= 1) {
        expectedWords = new string[0];
     }

     var words = identifier.GetWords();
     Assert.IsTrue(words.SequenceEqual(expectedWords));
  }

0

একটি সাধারণ সমাধান, যা একটি রেইগেক্স সমাধানের চেয়ে দ্রুতগতির অর্ডার (গুলি) হওয়া উচিত (বিশেষত ইনপুট স্ট্রিংয়ের আকার বাড়লে:

string s1 = "ThisIsATestStringAbcDefGhiJklMnoPqrStuVwxYz";
string s2;
StringBuilder sb = new StringBuilder();

foreach (char c in s1)
    sb.Append(char.IsUpper(c)
        ? " " + c.ToString()
        : c.ToString());

s2 = sb.ToString();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.