.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.