বড় বড় অক্ষরের আগে ফাঁকা স্থান যুক্ত করুন


193

"এই স্ট্রিংহ্যাসনোস্পেসেসবুটিটটসহ্যাভ ক্যাপিটালস" স্ট্রিংটি দেওয়া হয়েছে মূলধন বর্ণগুলির আগে স্পেস যুক্ত করার সর্বোত্তম উপায় কী। সুতরাং শেষ স্ট্রিংটি হবে "এই স্ট্রিংটির কোনও স্পেস নেই তবে এটির মূলধনগুলি নেই"

এখানে একটি রেজিএক্স সহ আমার প্রচেষ্টা

System.Text.RegularExpressions.Regex.Replace(value, "[A-Z]", " $0")

2
আপনার গ্রহণ করা পদ্ধতির বিষয়ে আপনার কি বিশেষ অভিযোগ আছে? এটি আমাদের আপনার পদ্ধতির উন্নতিতে সহায়তা করতে পারে।
ব্লেয়ার কনরাড

যদি রেজেক্স কাজ করে তবে আমি তার সাথে থাকব। রেজেক্স স্ট্রিং ম্যানিপুলেশনের জন্য অপ্টিমাইজড।
মাইকেল Meadows

আমি শুধু কৌতূহল এখানে আছে আরও ভাল বা সম্ভবত একটি বিল্ট এপ্রোচ আছে। এমনকি আমি অন্যান্য ভাষার সাথে অন্যান্য পদ্ধতিগুলি দেখতে আগ্রহী হতে চাই।
বব

2
আপনার কোডটি কেবল কার্যকর হয়নি কারণ পরিবর্তিত স্ট্রিংটি 'প্রতিস্থাপন' ফাংশনের রিটার্ন মান। এই কোড লাইন সহ: 'System.Text.RegularExpressions.Regex.Replace (মান, "[AZ]", "$ 0")। ট্রিম ();' এটি পুরোপুরি কাজ করবে। (কেবল মন্তব্য করছি কারণ আমি এই পোস্টে হোঁচট
খেয়েছি

রিজেক্স.রেপ্লেস ("এটি স্ট্রিংহাসনোস্পেসেসবুটিটটসহ্যাভ ক্যাপিটালস", @ "\ বি [এজেড]", এম => "" + মি);
সাকিব আদিল

উত্তর:


203

রেজেক্সসগুলি ভাল কাজ করবে (আমি এমনকি মার্টিন ব্রাউনদের জবাব দিয়েছি), তবে তারা ব্যয়বহুল (এবং ব্যক্তিগতভাবে আমি বেশ কয়েকটি চরিত্রের চেয়ে লম্বা কোনও প্যাটার্ন দেখতে পাইনি)

এই ফাংশন

string AddSpacesToSentence(string text, bool preserveAcronyms)
{
        if (string.IsNullOrWhiteSpace(text))
           return string.Empty;
        StringBuilder newText = new StringBuilder(text.Length * 2);
        newText.Append(text[0]);
        for (int i = 1; i < text.Length; i++)
        {
            if (char.IsUpper(text[i]))
                if ((text[i - 1] != ' ' && !char.IsUpper(text[i - 1])) ||
                    (preserveAcronyms && char.IsUpper(text[i - 1]) && 
                     i < text.Length - 1 && !char.IsUpper(text[i + 1])))
                    newText.Append(' ');
            newText.Append(text[i]);
        }
        return newText.ToString();
}

এটি 2,968,750 টিকগুলিতে 100,000 বার করে নেবে, রেজেক্স 25,000,000 টিক্স নেবে (এবং রেজেক্স সংকলিত সহ)।

এটি আরও ভাল, প্রদত্ত মানের জন্য (অর্থাত্ দ্রুত) তবে এটি বজায় রাখার জন্য আরও কোড। "আরও ভাল" প্রায়শই প্রতিযোগিতামূলক প্রয়োজনীয়তার সাথে আপস।

আশাকরি এটা সাহায্য করবে :)

আপডেট
যখন আমি এটি দেখলাম এটি বেশ দীর্ঘ সময়ই হয়েছে, এবং আমি ঠিক বুঝতে পেরেছি যে কোডটি পরিবর্তিত হওয়ার পরে সময়গুলি আপডেট করা হয়নি (এটি কেবলমাত্র কিছুটা পরিবর্তন হয়েছিল)।

'অ্যাববিবিবিবিবিবি' এর সাথে একটি স্ট্রিং ১০০ বার পুনরুক্ত করা হয়েছে (অর্থাত্ 1000 বাইট), 100,000 রূপান্তরগুলির একটি রান হাতে কোডেড ফাংশনটি নেয় 4,517,177 টিক্স এবং নীচের রেজেক্সটি 59,435,719 নেয় হ্যান্ড কোডেড ফাংশনটি গ্রহণের 7.6% সময়ে চালিত করে Regex।

আপডেট 2 এটি অ্যাকাউন্টে সংক্ষিপ্ত শব্দগুলি নেবে? এটা এখন! আইটেমের যুক্তিটি যদি মোটামুটি অস্পষ্ট হয় তবে আপনি দেখতে পাচ্ছেন এটি এতে প্রসারিত হচ্ছে ...

if (char.IsUpper(text[i]))
    if (char.IsUpper(text[i - 1]))
        if (preserveAcronyms && i < text.Length - 1 && !char.IsUpper(text[i + 1]))
            newText.Append(' ');
        else ;
    else if (text[i - 1] != ' ')
        newText.Append(' ');

... কিছুতেই সাহায্য করে না!

সংক্ষিপ্ত শব্দগুলি নিয়ে চিন্তা করবেন না এমন আসল সহজ পদ্ধতি এখানে

string AddSpacesToSentence(string text)
{
        if (string.IsNullOrWhiteSpace(text))
           return "";
        StringBuilder newText = new StringBuilder(text.Length * 2);
        newText.Append(text[0]);
        for (int i = 1; i < text.Length; i++)
        {
            if (char.IsUpper(text[i]) && text[i - 1] != ' ')
                newText.Append(' ');
            newText.Append(text[i]);
        }
        return newText.ToString();
}

8
যদি (চর.আইসআপার (পাঠ্য [i]) && পাঠ্য [i - 1]! = '') আপনি যদি উপরে কোডটি পুনরায় চালনা করেন তবে এটি স্পেস যুক্ত করে রাখে, এটি রাজধানীর আগে কোনও স্থান থাকলে স্থানগুলি যুক্ত করা বন্ধ করবে this চিঠি.
পল টালবট

আমি নিশ্চিত না তাই আমি ভেবেছিলাম যে আমি জিজ্ঞাসা করব, এই পদ্ধতিটি কি মার্টিন ব্রাউনের উত্তর "ড্রাইভআইএসএসসিএসসিপুয়ালিটি" তে বর্ণিত সংক্ষিপ্ত শব্দগুলি পরিচালনা করে, আদর্শভাবে "ড্রাইভ ইজ এসসিএসআই সামঞ্জস্যপূর্ণ" হয়ে উঠবে
কোপস

এটি বিবৃতিতে আপনার বিবরণের বিষয়বস্তু সদ্য আপডেট হওয়া যদি বিবৃতিগুলির সাথে প্রতিস্থাপন করে এটি 1 অক্ষর করে তোলে তবে আমি কিছু ভুল করছি?
কপস

1
চর লেখার জন্য একটি চেক যুক্ত করা (আইসলেট) (পাঠ্য [i + 1]) বিশেষ অক্ষর এবং অঙ্কগুলির সংক্ষিপ্ত শব্দগুলির সাথে সহায়তা করে (অর্থাত্ এবিসি_ডিএফটি এবি সি_ডিএফ হিসাবে বিভক্ত হবে না)।
HeXanon

1
আমি নিশ্চিত নই যে সংক্ষিপ্ত বিবরণ অংশটি যখন বন্ধ হবে তখন এটি সঠিক। আমি সবেমাত্র একটি পরীক্ষা চালিয়েছি "এসেনটেন্সিএবসি" "এসেন্সিটি এবি সি" তে প্রসারিত। "A Sentence AB C" হওয়া উচিত
টিম রটার

149

আপনার সমাধানটিতে একটি সমস্যা রয়েছে যে এটি প্রথম অক্ষর টি এর আগে একটি স্থান রেখেছিল যাতে আপনি পান

" This String..." instead of "This String..."

এটির পূর্ববর্তী নিম্নতর অক্ষরের জন্য এই চেহারাটি খুঁজে পেতে এবং তারপরে মাঝখানে স্থানটি সন্নিবেশ করান:

newValue = Regex.Replace(value, "([a-z])([A-Z])", "$1 $2");

সম্পাদনা 1:

আপনি @"(\p{Ll})(\p{Lu})"এটি ব্যবহার করলে উচ্চারণযুক্ত অক্ষরগুলিও বেছে নেবে।

সম্পাদনা 2:

যদি আপনার স্ট্রিংগুলিতে সংক্ষিপ্ত নাম থাকতে পারে তবে আপনি এটি ব্যবহার করতে পারেন:

newValue = Regex.Replace(value, @"((?<=\p{Ll})\p{Lu})|((?!\A)\p{Lu}(?>\p{Ll}))", " $0");

সুতরাং "ড্রাইভআইএসএসসিএসসিইপুয়ালিটি" "ড্রাইভ এসসিএসআই সামঞ্জস্যপূর্ণ" হয়ে ওঠে


3
আপনি কি কেবলমাত্র রেজালিক্স এবং ছাঁটাই () ফলাফল রাখতে পারবেন না?
পান্ডাওয়ুড

3
@ পান্ডাওড আপনি যা করতে পারেন তবে এটির জন্য আরেকটি মেমরি বরাদ্দ এবং স্ট্রিং কপি প্রয়োজন। এটি বলেছে যে পারফরম্যান্স যদি দুশ্চিন্তা হয় তবে কোনও রেজেক্স সম্ভবত কোনওভাবেই যাওয়ার সেরা উপায় নয়।
মার্টিন ব্রাউন

আপনি "([^A-Z\\s])([A-Z])"এমনকি সংক্ষিপ্ত শব্দ সহ ব্যবহার করতে পারেন ?
রুবেন 9922

82

পারফরম্যান্স পরীক্ষা করেনি, তবে এখানে লিনাকের সাথে এক লাইনে:

var val = "ThisIsAStringToTest";
val = string.Concat(val.Select(x => Char.IsUpper(x) ? " " + x : x.ToString())).TrimStart(' ');

18

আমি জানি এটি একটি পুরানো, তবে এটি করার দরকার হলে আমি এটি ব্যবহার করি:

public static class Extensions
{
    public static string ToSentence( this string Input )
    {
        return new string(Input.SelectMany((c, i) => i > 0 && char.IsUpper(c) ? new[] { ' ', c } : new[] { c }).ToArray());
    }
}

এটি আপনাকে ব্যবহারের অনুমতি দেবে MyCasedString.ToSentence()


আমি একটি এক্সটেনশন পদ্ধতি হিসাবে এর ধারণাটি পছন্দ করি, আপনি TrimStart(' ')এটি যুক্ত করলে অগ্রণী স্থানটি সরিয়ে ফেলা হবে।
ব্যবহারকারী 1069816

1
ধন্যবাদ @ user1069816। আমি ওভারলোডটি ব্যবহার করতে এক্সটেনশানটি পরিবর্তন করেছি SelectManyযার মধ্যে একটি সূচক রয়েছে, এইভাবে এটি প্রথম অক্ষর এবং অতিরিক্ত কলটির অপ্রয়োজনীয় সম্ভাব্য ওভারহেড এড়িয়ে চলে TrimStart(' ')। রব।
রব হার্ডি

8

ইউনিকোডে স্বাগতম

এই সমস্ত সমাধান আধুনিক পাঠ্যের জন্য মূলত ভুল। আপনার কেসটি বোঝে এমন কিছু ব্যবহার করতে হবে। যেহেতু বব অন্যান্য ভাষা জিজ্ঞাসা করেছে, আমি পার্লের জন্য একটি দম্পতি দেব।

আমি সবচেয়ে খারাপ থেকে সেরা পর্যন্ত চারটি সমাধান সরবরাহ করি। শুধুমাত্র সেরাটি সর্বদা সঠিক। অন্যদের সমস্যা আছে। কী কাজ করে এবং কোনটি হয় না এবং কোথায় কোথায় তা আপনাকে দেখানোর জন্য এখানে একটি পরীক্ষা চালানো হয়েছে। আমি আন্ডারস্কোরগুলি ব্যবহার করেছি যাতে আপনি দেখতে পাচ্ছেন যে স্থানগুলি কোথায় রাখা হয়েছে এবং আমি যে কোনও কিছুকে ভাল, ভুল হিসাবে চিহ্নিত করেছি।

Testing TheLoneRanger
               Worst:    The_Lone_Ranger
               Ok:       The_Lone_Ranger
               Better:   The_Lone_Ranger
               Best:     The_Lone_Ranger
Testing MountMKinleyNationalPark
     [WRONG]   Worst:    Mount_MKinley_National_Park
     [WRONG]   Ok:       Mount_MKinley_National_Park
     [WRONG]   Better:   Mount_MKinley_National_Park
               Best:     Mount_M_Kinley_National_Park
Testing ElÁlamoTejano
     [WRONG]   Worst:    ElÁlamo_Tejano
               Ok:       El_Álamo_Tejano
               Better:   El_Álamo_Tejano
               Best:     El_Álamo_Tejano
Testing TheÆvarArnfjörðBjarmason
     [WRONG]   Worst:    TheÆvar_ArnfjörðBjarmason
               Ok:       The_Ævar_Arnfjörð_Bjarmason
               Better:   The_Ævar_Arnfjörð_Bjarmason
               Best:     The_Ævar_Arnfjörð_Bjarmason
Testing IlCaffèMacchiato
     [WRONG]   Worst:    Il_CaffèMacchiato
               Ok:       Il_Caffè_Macchiato
               Better:   Il_Caffè_Macchiato
               Best:     Il_Caffè_Macchiato
Testing MisterDženanLjubović
     [WRONG]   Worst:    MisterDženanLjubović
     [WRONG]   Ok:       MisterDženanLjubović
               Better:   Mister_Dženan_Ljubović
               Best:     Mister_Dženan_Ljubović
Testing OleKingHenry
     [WRONG]   Worst:    Ole_King_Henry
     [WRONG]   Ok:       Ole_King_Henry
     [WRONG]   Better:   Ole_King_Henry
               Best:     Ole_King_Henry_
Testing CarlosⅤºElEmperador
     [WRONG]   Worst:    CarlosⅤºEl_Emperador
     [WRONG]   Ok:       CarlosⅤº_El_Emperador
     [WRONG]   Better:   CarlosⅤº_El_Emperador
               Best:     Carlos_Ⅴº_El_Emperador

বিটিডব্লিউ, এখানে প্রায় প্রত্যেকেই প্রথম পথটি বেছে নিয়েছে, এটি "সবচেয়ে খারাপ" হিসাবে চিহ্নিত হয়েছে। কয়েকজন "ওকে" চিহ্নিত করে দ্বিতীয় উপায়ে নির্বাচন করেছেন। তবে আমার আগে আর কেউ আপনাকে "বেটার" বা "সেরা" পদ্ধতির কীভাবে করবেন তা আপনাকে দেখায়নি।

এটির চারটি পদ্ধতি সহ পরীক্ষার প্রোগ্রামটি এখানে রয়েছে:

#!/usr/bin/env perl
use utf8;
use strict;
use warnings;

# First I'll prove these are fine variable names:
my (
    $TheLoneRanger              ,
    $MountMKinleyNationalPark  ,
    $ElÁlamoTejano              ,
    $TheÆvarArnfjörðBjarmason   ,
    $IlCaffèMacchiato           ,
    $MisterDženanLjubović         ,
    $OleKingHenry              ,
    $CarlosⅤºElEmperador        ,
);

# Now I'll load up some string with those values in them:
my @strings = qw{
    TheLoneRanger
    MountMKinleyNationalPark
    ElÁlamoTejano
    TheÆvarArnfjörðBjarmason
    IlCaffèMacchiato
    MisterDženanLjubović
    OleKingHenry
    CarlosⅤºElEmperador
};

my($new, $best, $ok);
my $mask = "  %10s   %-8s  %s\n";

for my $old (@strings) {
    print "Testing $old\n";
    ($best = $old) =~ s/(?<=\p{Lowercase})(?=[\p{Uppercase}\p{Lt}])/_/g;

    ($new = $old) =~ s/(?<=[a-z])(?=[A-Z])/_/g;
    $ok = ($new ne $best) && "[WRONG]";
    printf $mask, $ok, "Worst:", $new;

    ($new = $old) =~ s/(?<=\p{Ll})(?=\p{Lu})/_/g;
    $ok = ($new ne $best) && "[WRONG]";
    printf $mask, $ok, "Ok:", $new;

    ($new = $old) =~ s/(?<=\p{Ll})(?=[\p{Lu}\p{Lt}])/_/g;
    $ok = ($new ne $best) && "[WRONG]";
    printf $mask, $ok, "Better:", $new;

    ($new = $old) =~ s/(?<=\p{Lowercase})(?=[\p{Uppercase}\p{Lt}])/_/g;
    $ok = ($new ne $best) && "[WRONG]";
    printf $mask, $ok, "Best:", $new;
}

আপনি যখন এই ডেটাসেটে "সেরা" হিসাবে একই স্কোর করতে পারেন, আপনি জানেন যে আপনি এটি সঠিকভাবে করেছেন। ততক্ষণে, আপনি করেননি। এখানে অন্য কেউ "Ok" এর চেয়ে ভাল কাজ করেনি এবং বেশিরভাগ এটি "সবচেয়ে খারাপ" করেছেন। আমি কাউকে সঠিক কোডটি পোস্ট করার অপেক্ষায় রয়েছি।

আমি লক্ষ্য করেছি যে স্ট্যাকওভারফ্লো এর হাইলাইটিং কোডটি আবার খারাপভাবে স্টুপিড। তারা এখানে উল্লিখিত বাকি দরিদ্র পন্থাগুলির মতো (একই তবে সমস্ত নয়) সমস্ত পুরানো খোঁড়া তৈরি করছে। এএসসিআইআইকে বিশ্রাম দেওয়ার জন্য কি অতীত সময় নয়? এটি আর বোঝা যায় না, এবং আপনার কাছে যা আছে তা ভান করা কেবল ভুল। এটি খারাপ কোড তৈরি করে।


আপনার 'সেরা' উত্তরটি এখন পর্যন্ত নিকটতম বলে মনে হচ্ছে, তবে এটি শীর্ষস্থানীয় বিরামচিহ্ন বা অন্য শীর্ষস্থানীয় নন-লোয়ারকেস অক্ষরের জন্য বলে মনে হচ্ছে। এটি আমার (জাভাতে) সবচেয়ে ভাল কাজ করছে বলে মনে হচ্ছে: প্রতিস্থাপন (সমস্ত ("(? <= [^^ \\ পি {জাভাউপারকেস}])) (? = [\\ পি {জাভাউপারকেস}])", "");
রন্ধ্যা

হুম। আমি নিশ্চিত নই যে এই উদাহরণে রোমান অঙ্কগুলি অবশ্যই বড় হাতের হিসাবে গণনা করা উচিত। অক্ষরের মোডিফার উদাহরণটি অবশ্যই স্পষ্টভাবে গণনা করা উচিত নয়। আপনি ম্যাকডোনাল্ডস ডট কম এ গেলে দেখতে পাবেন এটি কোনও স্থান ছাড়াই লেখা আছে is
মার্টিন ব্রাউন

এটিও লক্ষ করা উচিত যে আপনি কখনই এটি নিখুঁত হতে পারবেন না। উদাহরণস্বরূপ আমি এমন একটি উদাহরণ দেখতে চাই যা "আলেকজান্দারভোন হম্বলড্ট" সাজায়, যা "আলেকজান্ডার ভন হাম্বোল্ট" হিসাবে শেষ হওয়া উচিত। তারপরে অবশ্যই এমন ভাষা রয়েছে যাগুলির মূলধন এবং লোয়ারকেসের গন্তব্য নেই।
মার্টিন ব্রাউন

8

আমি বাইনারি ওয়ারিয়ারের কোডের উপর ভিত্তি করে একটি সাধারণ এক্সটেনশন পদ্ধতি তৈরির উদ্দেশ্যে রচনা করেছি যা সংক্ষিপ্ত রূপগুলি সঠিকভাবে পরিচালনা করবে এবং এটি পুনরাবৃত্তিযোগ্য (ইতিমধ্যে ব্যবধানযুক্ত শব্দগুলিকে মঙ্গাল করবে না)। এখানে আমার ফলাফল।

public static string UnPascalCase(this string text)
{
    if (string.IsNullOrWhiteSpace(text))
        return "";
    var newText = new StringBuilder(text.Length * 2);
    newText.Append(text[0]);
    for (int i = 1; i < text.Length; i++)
    {
        var currentUpper = char.IsUpper(text[i]);
        var prevUpper = char.IsUpper(text[i - 1]);
        var nextUpper = (text.Length > i + 1) ? char.IsUpper(text[i + 1]) || char.IsWhiteSpace(text[i + 1]): prevUpper;
        var spaceExists = char.IsWhiteSpace(text[i - 1]);
        if (currentUpper && !spaceExists && (!nextUpper || !prevUpper))
                newText.Append(' ');
        newText.Append(text[i]);
    }
    return newText.ToString();
}

এখানে ইউনিট পরীক্ষার কেসগুলি এই ফাংশনটি পাস করে। আমি tchrist এর প্রস্তাবিত বেশিরভাগ ক্ষেত্রে এই তালিকায় যুক্ত করেছি এটি পাস না করে তাদের মধ্যে তিনটি (দুটি কেবল রোমান সংখ্যার) মন্তব্য করা হয়েছে:

Assert.AreEqual("For You And I", "ForYouAndI".UnPascalCase());
Assert.AreEqual("For You And The FBI", "ForYouAndTheFBI".UnPascalCase());
Assert.AreEqual("A Man A Plan A Canal Panama", "AManAPlanACanalPanama".UnPascalCase());
Assert.AreEqual("DNS Server", "DNSServer".UnPascalCase());
Assert.AreEqual("For You And I", "For You And I".UnPascalCase());
Assert.AreEqual("Mount Mᶜ Kinley National Park", "MountMᶜKinleyNationalPark".UnPascalCase());
Assert.AreEqual("El Álamo Tejano", "ElÁlamoTejano".UnPascalCase());
Assert.AreEqual("The Ævar Arnfjörð Bjarmason", "TheÆvarArnfjörðBjarmason".UnPascalCase());
Assert.AreEqual("Il Caffè Macchiato", "IlCaffèMacchiato".UnPascalCase());
//Assert.AreEqual("Mister Dženan Ljubović", "MisterDženanLjubović".UnPascalCase());
//Assert.AreEqual("Ole King Henry Ⅷ", "OleKingHenryⅧ".UnPascalCase());
//Assert.AreEqual("Carlos Ⅴº El Emperador", "CarlosⅤºElEmperador".UnPascalCase());
Assert.AreEqual("For You And The FBI", "For You And The FBI".UnPascalCase());
Assert.AreEqual("A Man A Plan A Canal Panama", "A Man A Plan A Canal Panama".UnPascalCase());
Assert.AreEqual("DNS Server", "DNS Server".UnPascalCase());
Assert.AreEqual("Mount Mᶜ Kinley National Park", "Mount Mᶜ Kinley National Park".UnPascalCase());

এখানে পোস্ট করা অন্যান্য সমাধানের মতো, এটি "রেগুলারআউটস" স্ট্রিংয়ের সাথে ব্যর্থ হয়। এটি "নিয়মিত ও এস" প্রদান করে
প্যাটি গুটি

4

বাইনারি ওয়ারিয়ার, আমি আপনার প্রস্তাবিত কোডটি ব্যবহার করেছি, এবং এটি বরং ভাল, আমার এটিতে কেবল একটি ছোটখাটো সংযোজন রয়েছে:

public static string AddSpacesToSentence(string text)
{
    if (string.IsNullOrEmpty(text))
        return "";
    StringBuilder newText = new StringBuilder(text.Length * 2);
    newText.Append(text[0]);
            for (int i = 1; i < result.Length; i++)
            {
                if (char.IsUpper(result[i]) && !char.IsUpper(result[i - 1]))
                {
                    newText.Append(' ');
                }
                else if (i < result.Length)
                {
                    if (char.IsUpper(result[i]) && !char.IsUpper(result[i + 1]))
                        newText.Append(' ');

                }
                newText.Append(result[i]);
            }
    return newText.ToString();
}

আমি একটি শর্ত যুক্ত করেছেন !char.IsUpper(text[i - 1])। এটি একটি বাগ ঠিক করেছে যা 'অ্যাভারেজনক্স' এর মতো কিছুকে 'এভারেজ নো এক্স' হিসাবে রূপান্তরিত করতে পারে, এটি অবশ্যই ভুল, কারণ এটি 'অ্যাভারেজ নক্স' পড়তে হবে read

দুঃখজনকভাবে এটিতে এখনও বাগটি রয়েছে যে আপনার কাছে 'ফরাসএস্টার্ট' লেখাটি থাকলে আপনি 'ফর্ম এ্যাসার্ট্ট' পেয়ে যাবেন।

এটি ঠিক করার বিষয়ে কোনও চিন্তা?


হয়তো ভালো কিছু কাজ করবে: char.IsUpper (পাঠ্য [আমি]) && (char.IsLower (লেখা [I - 1]) || (char.IsLower (লেখা [আমি + 1]))
মার্টিন ব্রাউন

1
এটি সঠিক এক: if (char.IsUpper(text[i]) && !(char.IsUpper(text[i - 1]) && char.IsUpper(text[i + 1])))পরীক্ষার ফলাফল: "শুরু থেকে", "শুরু থেকে", "একটি শুরু থেকে" তবে i < text.Length - 1শেষ অক্ষরটিকে উপেক্ষা করতে এবং সীমার ব্যতিক্রম ছাড়ার জন্য আপনাকে লুপ অবস্থার জন্য প্রয়োজন ।
কলএমএলএএনএন

ওহ এটা ঠিক একই। ! (a&& b) এবং (! a ||! খ) কারণ নিম্ন =! উপরের।
কলমেলএএনএন

3

এখানে আমার:

private string SplitCamelCase(string s) 
{ 
    Regex upperCaseRegex = new Regex(@"[A-Z]{1}[a-z]*"); 
    MatchCollection matches = upperCaseRegex.Matches(s); 
    List<string> words = new List<string>(); 
    foreach (Match match in matches) 
    { 
        words.Add(match.Value); 
    } 
    return String.Join(" ", words.ToArray()); 
}

এটি কি সি # হওয়ার কথা? যদি তাই হয় তবে কোন নামস্থানটি তালিকাভুক্ত? আপনার অর্থ কী অ্যারেলিস্ট বা তালিকা <স্ট্রিং>?
মার্টিন ব্রাউন

তালিকা <স্ট্রিং> ভাল হবে। এর জন্যে দুঃখিত.
কোরি ফয়ে

@ মার্টিন তাঁর কাছে সর্বদা সঠিক বাক্য গঠন ছিল, এটি মার্কডাউন সিনট্যাক্সের <pre><code>code</code></pre>পরিবর্তে একটি ব্লকে লুকানো ছিল । তাকে হ্রাস করার দরকার নেই (যদি তা আপনিই থাকতেন)।
জর্জ স্টকার 21

3

নিশ্চিত হয়ে নিন যে আপনি স্ট্রিংয়ের শুরুতে ফাঁকা স্থান রাখছেন না , তবে আপনি এগুলি পরপর রাজধানীর মধ্যে রাখছেন। এখানে কয়েকটি উত্তর or পয়েন্টগুলির মধ্যে একটি বা উভয়কেই সম্বোধন করে না। রেজেক্স বাদে অন্য উপায় রয়েছে তবে আপনি যদি এটি ব্যবহার করতে পছন্দ করেন তবে এটি ব্যবহার করে দেখুন:

Regex.Replace(value, @"\B[A-Z]", " $0")

\Bএকটি অস্বীকার করা হয় \b, তাই এটি একটি অ-শব্দ-সীমানা প্রতিনিধিত্ব করে,। এর অর্থ প্যাটার্নটি "Y" এর সাথে মেলে XYzabc, তবে Yzabcবা এর সাথে নয় X Yzabc। সামান্য বোনাস হিসাবে, আপনি এটিতে ফাঁকা ফাঁকা স্ট্রিং এ এটি ব্যবহার করতে পারেন এবং এটি তাদের দ্বিগুণ করবে না।


3

এই রেজেক্স প্রতিটি বড় বড় অক্ষরের সামনে একটি স্থান অক্ষর রাখে:

using System.Text.RegularExpressions;

const string myStringWithoutSpaces = "ThisIsAStringWithoutSpaces";
var myStringWithSpaces = Regex.Replace(myStringWithoutSpaces, "([A-Z])([a-z]*)", " $1$2");

"$ 1 $ 2" এর সামনে জায়গাটি মনে করুন, এটি এটি শেষ করবে।

এটি ফলাফল:

"This Is A String Without Spaces"

1
আপনি যদি নম্বরগুলিও আলাদা করতে চান তবে পরিবর্তে এই রেজেক্স প্যাটার্নটি ব্যবহার করুন:"([A-Z0-9])([a-z]*)"
ম্যাথিয়াস থম্যান

2

আপনার যা আছে তা নিখুঁতভাবে কাজ করে। valueএই ফাংশনের রিটার্ন মানটি পুনরায় সাইন ইন করতে মনে রাখবেন ।

value = System.Text.RegularExpressions.Regex.Replace(value, "[A-Z]", " $0");

2

আপনি কীভাবে এসকিউএল এ এটি করতে পারেন তা এখানে

create  FUNCTION dbo.PascalCaseWithSpace(@pInput AS VARCHAR(MAX)) RETURNS VARCHAR(MAX)
BEGIN
    declare @output varchar(8000)

set @output = ''


Declare @vInputLength        INT
Declare @vIndex              INT
Declare @vCount              INT
Declare @PrevLetter varchar(50)
SET @PrevLetter = ''

SET @vCount = 0
SET @vIndex = 1
SET @vInputLength = LEN(@pInput)

WHILE @vIndex <= @vInputLength
BEGIN
    IF ASCII(SUBSTRING(@pInput, @vIndex, 1)) = ASCII(Upper(SUBSTRING(@pInput, @vIndex, 1)))
       begin 

        if(@PrevLetter != '' and ASCII(@PrevLetter) = ASCII(Lower(@PrevLetter)))
            SET @output = @output + ' ' + SUBSTRING(@pInput, @vIndex, 1)
            else
            SET @output = @output +  SUBSTRING(@pInput, @vIndex, 1) 

        end
    else
        begin
        SET @output = @output +  SUBSTRING(@pInput, @vIndex, 1) 

        end

set @PrevLetter = SUBSTRING(@pInput, @vIndex, 1) 

    SET @vIndex = @vIndex + 1
END


return @output
END

2

@ মার্টিনব্রাউন থেকে অনুপ্রাণিত হয়ে সিম্পল রেজেজের দুটি লাইন, যা আপনার নামের সাথে সমাধান করবে, স্ট্রিংয়ের যে কোনও জায়গায় অ্যাকায়রনাম সহ।

public string ResolveName(string name)
{
   var tmpDisplay = Regex.Replace(name, "([^A-Z ])([A-Z])", "$1 $2");
   return Regex.Replace(tmpDisplay, "([A-Z]+)([A-Z][^A-Z$])", "$1 $2").Trim();
}

আমি এই সমাধানটি পছন্দ করি। এটি সংক্ষিপ্ত এবং দ্রুত। তবে অন্যান্য সমাধানের মতোই এটি "রেগুলারআউটস" স্ট্রিংয়ের সাথে ব্যর্থ হয়। আমি এখানে যত চেষ্টা করেছি
সেগুলির

@ পতিগুটি ওপি ক্যাপিটালের আগে জায়গা চেয়েছিলেন, তিনি সংক্ষিপ্তসারগুলি উল্লেখ করেননি, আমাদের কাছে প্রোডাকশন কোডে একটি সংশোধন রয়েছে
জননি 5

আপনি ঠিক করতে পারেন? আমার ডেটাতে আমার মতো স্ট্রিং রয়েছে এবং এটি আমাকে ভুল ফলাফল দিচ্ছে। ধন্যবাদ।
পতে গুটি

@ পটিগুটি দুঃখিত, আপনি যা চান তা আমি ভুলভাবে পড়েছি। বহুবচন এক ভিন্ন সমস্যা, `নিয়মিত 'আপনি' নিয়মিত ওটি 'বা" নিয়মিত ওটি এস "হওয়ার কী প্রত্যাশা করছেন
জননি 5

1
@ পতিগুটি আমি আপনার উত্তর আমার জন্য আপডেট করেছি, আমি বিশ্বাস করি যে কাজ করা উচিত
জননি 5


1
static string AddSpacesToColumnName(string columnCaption)
    {
        if (string.IsNullOrWhiteSpace(columnCaption))
            return "";
        StringBuilder newCaption = new StringBuilder(columnCaption.Length * 2);
        newCaption.Append(columnCaption[0]);
        int pos = 1;
        for (pos = 1; pos < columnCaption.Length-1; pos++)
        {               
            if (char.IsUpper(columnCaption[pos]) && !(char.IsUpper(columnCaption[pos - 1]) && char.IsUpper(columnCaption[pos + 1])))
                newCaption.Append(' ');
            newCaption.Append(columnCaption[pos]);
        }
        newCaption.Append(columnCaption[pos]);
        return newCaption.ToString();
    }

1

রিবিজেপ-এর মাধ্যমে রুবিতে:

"FooBarBaz".gsub(/(?!^)(?=[A-Z])/, ' ') # => "Foo Bar Baz"

1
ওহো দুঃখিত. আমি মিস করেছি যে এটি সি # -র নির্দিষ্ট প্রশ্ন এবং এখানে রুবির উত্তর পোস্ট করেছেন :(
আর্টেম

1

আমি কেভিন স্ট্রাইকারদের দুর্দান্ত সমাধান নিয়েছি এবং ভিবিতে রূপান্তর করেছি। যেহেতু আমি .NET 3.5 এ লক করেছি তাই আমাকে ইসনুলআরওহাইটস্পেসও লিখতে হয়েছিল। এটি তার সমস্ত পরীক্ষায় পাস করে।

<Extension()>
Public Function IsNullOrWhiteSpace(value As String) As Boolean
    If value Is Nothing Then
        Return True
    End If
    For i As Integer = 0 To value.Length - 1
        If Not Char.IsWhiteSpace(value(i)) Then
            Return False
        End If
    Next
    Return True
End Function

<Extension()>
Public Function UnPascalCase(text As String) As String
    If text.IsNullOrWhiteSpace Then
        Return String.Empty
    End If

    Dim newText = New StringBuilder()
    newText.Append(text(0))
    For i As Integer = 1 To text.Length - 1
        Dim currentUpper = Char.IsUpper(text(i))
        Dim prevUpper = Char.IsUpper(text(i - 1))
        Dim nextUpper = If(text.Length > i + 1, Char.IsUpper(text(i + 1)) Or Char.IsWhiteSpace(text(i + 1)), prevUpper)
        Dim spaceExists = Char.IsWhiteSpace(text(i - 1))
        If (currentUpper And Not spaceExists And (Not nextUpper Or Not prevUpper)) Then
            newText.Append(" ")
        End If
        newText.Append(text(i))
    Next
    Return newText.ToString()
End Function

1

প্রশ্নটি কিছুটা পুরানো তবে আজকাল নুগেটে একটি দুর্দান্ত গ্রন্থাগার রয়েছে যা হুবহু এটি করে তোলে পাশাপাশি অনেকগুলি মানব পাঠযোগ্য পাঠ্যে রূপান্তর।

পরীক্ষা করে দেখুন Humanizer উপর GitHub বা Nuget।

উদাহরণ

"PascalCaseInputStringIsTurnedIntoSentence".Humanize() => "Pascal case input string is turned into sentence"
"Underscored_input_string_is_turned_into_sentence".Humanize() => "Underscored input string is turned into sentence"
"Underscored_input_String_is_turned_INTO_sentence".Humanize() => "Underscored input String is turned INTO sentence"

// acronyms are left intact
"HTML".Humanize() => "HTML"

সেক্ষেত্রে চেষ্টা করেছি এবং প্রথম লিঙ্কটি এখন ভাঙা। নিউগেট কাজ করে, তবে প্যাকেজটি আমার সমাধানটিতে সংকলন করে না। একটি দুর্দান্ত ধারণা, যদি এটি কাজ করে।
ফিল্ম

1

এর জন্য একটি ভাল সুযোগ বলে মনে হচ্ছে Aggregate। এটি পাঠযোগ্য হতে ডিজাইন করা হয়েছে, বিশেষত দ্রুত প্রয়োজন হয় না।

someString
.Aggregate(
   new StringBuilder(),
   (str, ch) => {
      if (char.IsUpper(ch) && str.Length > 0)
         str.Append(" ");
      str.Append(ch);
      return str;
   }
).ToString();

0

মার্টিন ব্রাউন এর উত্তর ছাড়াও, আমারও সংখ্যাগুলির সাথে একটি সমস্যা ছিল। উদাহরণস্বরূপ: "অবস্থান 2", বা "জান 22" যথাক্রমে "অবস্থান 2" এবং "22 জানুয়ারী" হওয়া উচিত।

মার্টিন ব্রাউন এর উত্তরটি ব্যবহার করে তা করার জন্য আমার নিয়মিত প্রকাশ:

"((?<=\p{Ll})\p{Lu})|((?!\A)\p{Lu}(?>\p{Ll}))|((?<=[\p{Ll}\p{Lu}])\p{Nd})|((?<=\p{Nd})\p{Lu})"

প্রতিটি অংশের অর্থ কী তা বোঝার জন্য এখানে কয়েকটি দারুণ সাইট রয়েছে:

জাভা ভিত্তিক নিয়মিত এক্সপ্রেশন বিশ্লেষক (তবে বেশিরভাগ। নেট রেজেক্সের জন্য কাজ করে)

অ্যাকশন স্ক্রিপ্ট ভিত্তিক বিশ্লেষক

উপরে Regex কর্ম স্ক্রিপ্ট সাইটে কাজ করবে না যদি না আপনি সব প্রতিস্থাপন \p{Ll}সঙ্গে [a-z], \p{Lu}সঙ্গে [A-Z], এবং \p{Nd}সঙ্গে [0-9]


0

বাইনারি ওয়ারিয়ার্সের পরামর্শ এবং রিচার্ড প্রিডিসের মন্তব্যের ভিত্তিতে আমার সমাধানটি এখানে দেওয়া হয়েছে, তবে এই বিষয়টিও বিবেচনায় রেখে যে প্রদত্ত স্ট্রিংয়ে সাদা স্থান থাকতে পারে, সুতরাং এটি বিদ্যমান সাদা জায়গার পাশে সাদা স্থান যুক্ত করবে না।

public string AddSpacesBeforeUpperCase(string nonSpacedString)
    {
        if (string.IsNullOrEmpty(nonSpacedString))
            return string.Empty;

        StringBuilder newText = new StringBuilder(nonSpacedString.Length * 2);
        newText.Append(nonSpacedString[0]);

        for (int i = 1; i < nonSpacedString.Length; i++)
        {
            char currentChar = nonSpacedString[i];

            // If it is whitespace, we do not need to add another next to it
            if(char.IsWhiteSpace(currentChar))
            {
                continue;
            }

            char previousChar = nonSpacedString[i - 1];
            char nextChar = i < nonSpacedString.Length - 1 ? nonSpacedString[i + 1] : nonSpacedString[i];

            if (char.IsUpper(currentChar) && !char.IsWhiteSpace(nextChar) 
                && !(char.IsUpper(previousChar) && char.IsUpper(nextChar)))
            {
                newText.Append(' ');
            }
            else if (i < nonSpacedString.Length)
            {
                if (char.IsUpper(currentChar) && !char.IsWhiteSpace(nextChar) && !char.IsUpper(nextChar))
                {
                    newText.Append(' ');
                }
            }

            newText.Append(currentChar);
        }

        return newText.ToString();
    }

0

যে কেউ এই একই প্রশ্নের উত্তর দেওয়ার জন্য একটি সি ++ ফাংশন সন্ধান করছেন, আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন। এটি @ বাইনারি ওয়ারিয়ারের দেওয়া উত্তরের পরে মডেল করা হয়েছে। এই পদ্ধতিটি কেবলমাত্র স্বয়ংক্রিয়ভাবে সংক্ষিপ্ত শব্দগুলি সংরক্ষণ করে।

using namespace std;

void AddSpacesToSentence(string& testString)
        stringstream ss;
        ss << testString.at(0);
        for (auto it = testString.begin() + 1; it != testString.end(); ++it )
        {
            int index = it - testString.begin();
            char c = (*it);
            if (isupper(c))
            {
                char prev = testString.at(index - 1);
                if (isupper(prev))
                {
                    if (index < testString.length() - 1)
                    {
                        char next = testString.at(index + 1);
                        if (!isupper(next) && next != ' ')
                        {
                            ss << ' ';
                        }
                    }
                }
                else if (islower(prev)) 
                {
                   ss << ' ';
                }
            }

            ss << c;
        }

        cout << ss.str() << endl;

আমি এই ফাংশনটির জন্য পরীক্ষামূলক স্ট্রিং ব্যবহার করেছি এবং ফলাফলগুলি হ'ল:

  • "হ্যালো ওয়ার্ল্ড" -> "হ্যালো ওয়ার্ল্ড"
  • "হ্যালো ওয়ার্ল্ড" -> "হ্যালো ওয়ার্ল্ড"
  • "হ্যালোএবিসি ওয়ার্ল্ড" -> "হ্যালো এবিসি ওয়ার্ল্ড"
  • "হ্যালো ওয়ার্ল্ডএবিসি" -> "হ্যালো ওয়ার্ল্ড এবিসি"
  • "ABCHelloWorld" -> "এবিসি হ্যালো ওয়ার্ল্ড"
  • "এবিসি হেল্লো ওয়ার্ল্ড" -> "এবিসি হেলো ওয়ার্ল্ড"
  • "ABCHELLOWORLD" -> "অবতরণ"
  • "এ" -> "এ"

0

একটি সি # একটি ইনপুট স্ট্রিংটি শুধুমাত্র ASCII অক্ষর নিয়ে গঠিত জন্য সমাধান। Regex অন্তর্ভুক্ত নেতিবাচক lookbehind যে স্ট্রিং শুরুতে মনে হচ্ছে, একটি রাজধানী (বড় হাতের অক্ষরে) চিঠি উপেক্ষা করার। পছন্দসই স্ট্রিংটি ফিরিয়ে দিতে Regex.Replace () ব্যবহার করে ।

এছাড়াও regex101.com ডেমো দেখুন

using System;
using System.Text.RegularExpressions;

public class RegexExample
{
    public static void Main()
    {
        var text = "ThisStringHasNoSpacesButItDoesHaveCapitals";

        // Use negative lookbehind to match all capital letters
        // that do not appear at the beginning of the string.
        var pattern = "(?<!^)([A-Z])";

        var rgx = new Regex(pattern);
        var result = rgx.Replace(text, " $1");
        Console.WriteLine("Input: [{0}]\nOutput: [{1}]", text, result);
    }
}

প্রত্যাশিত আউটপুট:

Input: [ThisStringHasNoSpacesButItDoesHaveCapitals]
Output: [This String Has No Spaces But It Does Have Capitals]

আপডেট: এখানে একটি পরিবর্তন রয়েছে যা সংক্ষিপ্ত রূপগুলিও হ্যান্ডেল করবে (উচ্চ-অক্ষরের অক্ষরের ক্রম)।

এছাড়াও regex101.com ডেমো এবং আদর্শ one.com ডেমো দেখুন

using System;
using System.Text.RegularExpressions;

public class RegexExample
{
    public static void Main()
    {
        var text = "ThisStringHasNoSpacesASCIIButItDoesHaveCapitalsLINQ";

        // Use positive lookbehind to locate all upper-case letters
        // that are preceded by a lower-case letter.
        var patternPart1 = "(?<=[a-z])([A-Z])";

        // Used positive lookbehind and lookahead to locate all
        // upper-case letters that are preceded by an upper-case
        // letter and followed by a lower-case letter.
        var patternPart2 = "(?<=[A-Z])([A-Z])(?=[a-z])";

        var pattern = patternPart1 + "|" + patternPart2;
        var rgx = new Regex(pattern);
        var result = rgx.Replace(text, " $1$2");

        Console.WriteLine("Input: [{0}]\nOutput: [{1}]", text, result);
    }
}

প্রত্যাশিত আউটপুট:

Input: [ThisStringHasNoSpacesASCIIButItDoesHaveCapitalsLINQ]
Output: [This String Has No Spaces ASCII But It Does Have Capitals LINQ]

0

এখানে আরও বিশদ সমাধান যা শব্দের সামনে স্পেস রাখে না:

দ্রষ্টব্য: আমি একাধিক Regexs ব্যবহার করেছি (সংক্ষিপ্ত নয় তবে এটি সংক্ষিপ্ত শব্দ এবং একক অক্ষরের শব্দও পরিচালনা করবে)

Dim s As String = "ThisStringHasNoSpacesButItDoesHaveCapitals"
s = System.Text.RegularExpressions.Regex.Replace(s, "([a-z])([A-Z](?=[A-Z])[a-z]*)", "$1 $2")
s = System.Text.RegularExpressions.Regex.Replace(s, "([A-Z])([A-Z][a-z])", "$1 $2")
s = System.Text.RegularExpressions.Regex.Replace(s, "([a-z])([A-Z][a-z])", "$1 $2")
s = System.Text.RegularExpressions.Regex.Replace(s, "([a-z])([A-Z][a-z])", "$1 $2") // repeat a second time

ইন :

"ThisStringHasNoSpacesButItDoesHaveCapitals"
"IAmNotAGoat"
"LOLThatsHilarious!"
"ThisIsASMSMessage"

আউট :

"This String Has No Spaces But It Does Have Capitals"
"I Am Not A Goat"
"LOL Thats Hilarious!"
"This Is ASMS Message" // (Difficult to handle single letter words when they are next to acronyms.)

এই ফলাফলটি "এই স্ট্রিংয়ের কোনও স্পেস নেই তবে এটির মূলধন রয়েছে"
অ্যান্ডি রবিনসন

হাই, অ্যান্ডি রবিনসন, ধন্যবাদ আমি একাধিক রেজেক্স প্রতিস্থাপন ব্যবহার করতে পরিবর্তন করেছি। আরও সংক্ষিপ্ত উপায় আছে কিনা তা নিশ্চিত নন তবে এটি এখন কাজ করে।
ক্রেজিটাইম

0

পূর্ববর্তী সমস্ত প্রতিক্রিয়াগুলি খুব জটিল দেখায়।

আমার কাছে স্ট্রিং রয়েছে যা ক্যাপিটালগুলির মিশ্রণযুক্ত ছিল এবং _ তাই ব্যবহৃত হয়েছে, স্ট্রিং,

for (int i = 0; i < result.Length; i++)
{
    if (char.IsUpper(result[i]))
    {
        counter++;
        if (i > 1) //stops from adding a space at if string starts with Capital
        {
            result = result.Insert(i, " ");
            i++; //Required** otherwise stuck in infinite 
                 //add space loop over a single capital letter.
        }
    }
}

0

বাইনারি ওয়ারিয়ার উত্তর দ্বারা অনুপ্রাণিত হয়ে আমি এটিতে দুলছিলাম।

ফলাফল এখানে:

/// <summary>
/// String Extension Method
/// Adds white space to strings based on Upper Case Letters
/// </summary>
/// <example>
/// strIn => "HateJPMorgan"
/// preserveAcronyms false => "Hate JP Morgan"
/// preserveAcronyms true => "Hate JPMorgan"
/// </example>
/// <param name="strIn">to evaluate</param>
/// <param name="preserveAcronyms" >determines saving acronyms (Optional => false) </param>
public static string AddSpaces(this string strIn, bool preserveAcronyms = false)
{
    if (string.IsNullOrWhiteSpace(strIn))
        return String.Empty;

    var stringBuilder = new StringBuilder(strIn.Length * 2)
        .Append(strIn[0]);

    int i;

    for (i = 1; i < strIn.Length - 1; i++)
    {
        var c = strIn[i];

        if (Char.IsUpper(c) && (Char.IsLower(strIn[i - 1]) || (preserveAcronyms && Char.IsLower(strIn[i + 1]))))
            stringBuilder.Append(' ');

        stringBuilder.Append(c);
    }

    return stringBuilder.Append(strIn[i]).ToString();
}

10000000 পুনরাবৃত্তি এবং বিভিন্ন স্ট্রিং দৈর্ঘ্য এবং সংমিশ্রণগুলি স্টপওয়াচ ব্যবহার করে পরীক্ষা করেছে।

বাইনারি ওয়ারিয়ার উত্তরের চেয়ে গড়ে 50% (সম্ভবত কিছুটা বেশি) দ্রুত


0
    private string GetProperName(string Header)
    {
        if (Header.ToCharArray().Where(c => Char.IsUpper(c)).Count() == 1)
        {
            return Header;
        }
        else
        {
            string ReturnHeader = Header[0].ToString();
            for(int i=1; i<Header.Length;i++)
            {
                if (char.IsLower(Header[i-1]) && char.IsUpper(Header[i]))
                {
                    ReturnHeader += " " + Header[i].ToString();
                }
                else
                {
                    ReturnHeader += Header[i].ToString();
                }
            }

            return ReturnHeader;
        }

        return Header;
    }

0

এর একটিতে সংক্ষিপ্ত বিবরণ এবং সংক্ষিপ্ত বিবরণগুলি অন্তর্ভুক্ত এবং এটি গৃহীত উত্তরের চেয়ে কিছুটা দ্রুত:

public string Sentencify(string value)
{
    if (string.IsNullOrWhiteSpace(value))
        return string.Empty;

    string final = string.Empty;
    for (int i = 0; i < value.Length; i++)
    {
        if (i != 0 && Char.IsUpper(value[i]))
        {
            if (!Char.IsUpper(value[i - 1]))
                final += " ";
            else if (i < (value.Length - 1))
            {
                if (!Char.IsUpper(value[i + 1]) && !((value.Length >= i && value[i + 1] == 's') ||
                                                     (value.Length >= i + 1 && value[i + 1] == 'e' && value[i + 2] == 's')))
                    final += " ";
            }
        }

        final += value[i];
    }

    return final;
}

এই পরীক্ষাগুলি পাস:

string test1 = "RegularOTs";
string test2 = "ThisStringHasNoSpacesASCIIButItDoesHaveCapitalsLINQ";
string test3 = "ThisStringHasNoSpacesButItDoesHaveCapitals";

গৃহীত উত্তরটি সেই ক্ষেত্রে মোকাবেলা করে যেখানে মানটি বাতিল হয়
ক্রিস এফ ক্যারল

এটি আউটপুটটির সামনে একটি অতিরিক্ত স্থান যুক্ত করে, যেমন HireDate => "ভাড়া তারিখ"। একটি চূড়ান্ত প্রয়োজন ri ট্রিমস্টার্ট বা কিছু। আমি মনে করি যে অন্য উত্তরগুলির মধ্যে একটি নীচের দিকে নির্দেশ করছে তবে পুনরায় অর্ডার করার কারণে আমি নিশ্চিত নই যে তার উত্তরটি রেজিএক্স ভিত্তিক হওয়ায় তিনি আপনার সাথে কথা বলছিলেন কিনা।
b_levitt

ভাল ক্যাচ ... আমার পরীক্ষাগুলিতে একটি শুরু এবং শেষ চিহ্ন যুক্ত করা উচিত ছিল ... এখনই ঠিক করা।
সেরজ সাগান

এখানে পোস্ট করা অন্যান্য সমাধানের মতো, এটি "রেগুলারআউটস" স্ট্রিংয়ের সাথে ব্যর্থ হয়। এটি "নিয়মিত ও এস" প্রদান করে
প্যাটি গুটি

সংক্ষিপ্তসার বহুবচন আনার জন্য ধন্যবাদ, আমি এটির জন্যও কাজ করতে আপডেট করেছি।
সার্জ সাগান

0

এর সাথে একটি বাস্তবায়ন fold, এটি হিসাবে পরিচিত Aggregate:

    public static string SpaceCapitals(this string arg) =>
       new string(arg.Aggregate(new List<Char>(),
                      (accum, x) => 
                      {
                          if (Char.IsUpper(x) &&
                              accum.Any() &&
                              // prevent double spacing
                              accum.Last() != ' ' &&
                              // prevent spacing acronyms (ASCII, SCSI)
                              !Char.IsUpper(accum.Last()))
                          {
                              accum.Add(' ');
                          }

                          accum.Add(x);

                          return accum;
                      }).ToArray());

অনুরোধ ছাড়াও, এই বাস্তবায়ন সঠিকভাবে নেতৃস্থানীয়, অভ্যন্তরীণ, পিছনে স্থান এবং সংক্ষিপ্ত নাম সংরক্ষণ করে,

" SpacedWord " => " Spaced Word ",  

"Inner Space" => "Inner Space",  

"SomeACRONYM" => "Some ACRONYM".

0

ছোট হাতের অক্ষর, বড় হাতের অক্ষর বা অঙ্কগুলির পরে স্পেস যুক্ত করার একটি সহজ উপায়।

    string AddSpacesToSentence(string value, bool spaceLowerChar = true, bool spaceDigitChar = true, bool spaceSymbolChar = false)
    {
        var result = "";

        for (int i = 0; i < value.Length; i++)
        {
            char currentChar = value[i];
            char nextChar = value[i < value.Length - 1 ? i + 1 : value.Length - 1];

            if (spaceLowerChar && char.IsLower(currentChar) && !char.IsLower(nextChar))
            {
                result += value[i] + " ";
            }
            else if (spaceDigitChar && char.IsDigit(currentChar) && !char.IsDigit(nextChar))
            {
                result += value[i] + " ";
            }
            else if(spaceSymbolChar && char.IsSymbol(currentChar) && !char.IsSymbol(nextChar))
            {
                result += value[i];
            }
            else
            {
                result += value[i];
            }
        }

        return result;
    }

1
কোড-কেবল উত্তরগুলি নিরুৎসাহিত করা হয়। দয়া করে সম্পাদনাতে ক্লিক করুন এবং আপনার কোডটি প্রশ্নটিকে কীভাবে সম্বোধন করে তা সংক্ষেপ করে কিছু শব্দ যুক্ত করুন বা সম্ভবত আপনার উত্তরটি পূর্ববর্তী উত্তর / উত্তরগুলির থেকে আলাদা কীভাবে ব্যাখ্যা করুন। পর্যালোচনা থেকে
নিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.