เพิ่มช่องว่างก่อนตัวพิมพ์ใหญ่


194

กำหนดสตริง "ThisStringHasNoSpacesButItDoesHaveCapitals" เป็นวิธีที่ดีที่สุดในการเพิ่มช่องว่างก่อนตัวพิมพ์ใหญ่อะไร ดังนั้นสตริงสุดท้ายจะเป็น "สตริงนี้ไม่มีช่องว่าง แต่จะมีตัวพิมพ์ใหญ่"

นี่คือความพยายามของฉันกับ RegEx

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

2
คุณมีข้อร้องเรียนเฉพาะเกี่ยวกับวิธีการที่คุณทำหรือไม่? นั่นอาจช่วยเราปรับปรุงวิธีการของคุณ
แบลร์คอนราด

ถ้า regex ทำงานแล้วฉันก็จะยึดติดกับมัน Regex เป็น optamized สำหรับการจัดการสตริง
Michael Meadows

ฉันแค่อยากรู้อยากเห็นว่ามีวิธีที่ดีกว่าหรืออาจจะเป็นในตัว ฉันยังอยากรู้อยากเห็นวิธีการอื่น ๆ ด้วยภาษาอื่น ๆ
Bob

2
รหัสของคุณใช้งานไม่ได้เนื่องจากสตริงที่แก้ไขคือค่าส่งคืนของฟังก์ชัน 'แทนที่' ด้วยบรรทัดรหัสนี้: 'System.Text.RegularExpressions.Regex.Replace (ค่า "[AZ]", "$ 0") ตัด ();' มันจะทำงานได้อย่างสมบูรณ์แบบ (เพียงแค่แสดงความคิดเห็นเพราะฉัน stumbled เหนือโพสต์นี้และไม่มีใครเห็นจริง ๆ สิ่งที่ผิดกับรหัสของคุณ.)
Mattu475

Regex.Replace ("ThisStringHasNoSpacesButItDoesHaveCapitals", @ "\ B [AZ]", m => "" + m);
saquib adil

คำตอบ:


203

regexes จะทำงานได้ดี (ฉันลงคะแนนให้คำตอบ Martin Browns) แต่พวกเขามีราคาแพง (และโดยส่วนตัวแล้วฉันพบรูปแบบใด ๆ ที่ยาวกว่าตัวละครสองตัวที่ห้ามไม่ให้ป้าน)

ฟังก์ชั่นนี้

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

จะทำ 100,000 ครั้งใน 2,968,750 เห็บ Regex จะใช้ 25,000,000 เห็บ (และนั่นก็คือคอมไพล์ regex)

มันจะดีกว่าสำหรับค่าที่กำหนดไว้ที่ดีกว่า (เช่นเร็วกว่า) แต่จะมีรหัสมากกว่าที่จะรักษา "ดีกว่า" มักจะประนีประนอมความต้องการของคู่แข่ง

หวังว่าจะช่วย :)

อัปเดต
มันใช้เวลานานมากตั้งแต่ฉันดูสิ่งนี้และฉันเพิ่งตระหนักว่าการกำหนดเวลายังไม่ได้รับการอัปเดตนับตั้งแต่มีการเปลี่ยนแปลงรหัส (เปลี่ยนเพียงเล็กน้อย)

ในสตริงที่มี 'Abbbbbbbbb' ทำซ้ำ 100 ครั้ง (เช่น 1,000 ไบต์) การวิ่ง 100,000 ครั้งจะใช้ฟังก์ชันการเข้ารหัสด้วยมือ 4,517,177 เห็บและ Regex ด้านล่างใช้ 59,435,719 ในการใช้ฟังก์ชั่น Hand coded ใน 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
if (char.IsUpper (text [i]) && text [i - 1]! = '') หากคุณเรียกใช้รหัสข้างบนอีกครั้งมันจะเพิ่มช่องว่างการหยุดนี้จะเป็นการเพิ่มช่องว่างถ้ามีช่องว่างหน้าเมืองหลวง จดหมาย
Paul Talbot

ฉันไม่แน่ใจดังนั้นฉันคิดว่าฉันจะถามวิธีนี้จะจัดการคำย่อตามที่อธิบายไว้ในคำตอบของ Martin Brown "DriveIsSCSICIC กันได้" จะกลายเป็น "Drive Is SCSI Compatible"
Coops

นั่นทำให้มันเป็น 1 ตัวอักษรโดยแทนที่เนื้อหาของคุณสำหรับคำสั่งด้วยการปรับปรุงใหม่ถ้างบฉันอาจจะทำอะไรผิดหรือเปล่า?
Coops

1
การเพิ่มการตรวจสอบสำหรับ char.IsLetter (ข้อความ [i + 1]) จะช่วยให้มีตัวย่อที่มีตัวอักษรและตัวเลขพิเศษ (เช่น ABC_DEF จะไม่แยกเป็น AB C_DEF)
HeXanon

1
ฉันไม่แน่ใจว่าส่วนย่อนั้นถูกต้องเมื่อปิดเครื่อง ฉันเพิ่งทดสอบ "ASentenceABC" ขยายเป็น "ASentence AB C" ควรเป็น "ประโยค AB AB"
Tim Rutter

150

วิธีการแก้ปัญหาของคุณมีปัญหาในการที่จะทำให้ช่องว่างก่อนอักษรตัวแรก T เพื่อให้คุณได้รับ

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

ดังนั้น "DriveIsSCSIC ที่เข้ากันได้" จึงกลายเป็น "ไดรฟ์รองรับ SCSI"


3
คุณไม่สามารถเก็บ RegEx ดั้งเดิมและ Trim () ผลลัพธ์ไว้ได้หรือไม่
PandaWood

3
@PandaWood คุณทำได้ แต่ต้องการการจัดสรรหน่วยความจำและการคัดลอกสตริงอื่น ที่กล่าวว่าหากประสิทธิภาพเป็นกังวล Regex อาจไม่ใช่วิธีที่ดีที่สุดที่จะไป แต่อย่างใด
Martin Brown

คุณสามารถใช้"([^A-Z\\s])([A-Z])"กับตัวย่อได้ด้วย?
Ruben9922

82

ไม่ได้ทดสอบประสิทธิภาพ แต่ที่นี่อยู่ในบรรทัดเดียวกับ linq:

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(' ')มันจะลบช่องว่างนำ
user1069816

1
ขอบคุณ @ user1069816 ฉันมีการเปลี่ยนแปลงการขยายการใช้งานเกินพิกัดของซึ่งรวมถึงดัชนีวิธีนี้จะหลีกเลี่ยงตัวอักษรตัวแรกและค่าใช้จ่ายที่อาจเกิดขึ้นที่ไม่จำเป็นของการโทรเพิ่มเติมเพื่อSelectMany TrimStart(' ')ปล้น.
Rob Hardy

9

ฉันตั้งค่าเพื่อให้วิธีการขยายอย่างง่ายตามรหัสของ Binary Worrier ซึ่งจะจัดการกับคำย่ออย่างถูกต้องและสามารถทำซ้ำได้ นี่คือผลลัพธ์ของฉัน

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

คล้ายกับโซลูชันอื่น ๆ ที่โพสต์ที่นี่มันล้มเหลวด้วยสตริง "RegularOTs" จะส่งคืน "Regular O Ts"
Patee Gutee

8

ยินดีต้อนรับสู่ Unicode

การแก้ปัญหาทั้งหมดเหล่านี้ผิดหลักสำหรับข้อความสมัยใหม่ คุณต้องใช้สิ่งที่เข้าใจกรณีและปัญหา ตั้งแต่บ๊อบถามหาภาษาอื่นฉันจะให้ Perl สองสามอัน

ฉันมีวิธีแก้ปัญหาสี่แบบตั้งแต่แย่ที่สุดไปจนถึงดีที่สุด สิ่งที่ดีที่สุดเท่านั้นที่ถูกต้องเสมอ คนอื่นมีปัญหา นี่คือการทดสอบเพื่อแสดงให้คุณเห็นว่าอะไรใช้งานได้และอะไรที่ไม่ได้และที่ไหน ฉันใช้ขีดเส้นใต้เพื่อให้คุณสามารถดูได้ว่ามีการเว้นช่องว่างไว้ที่ไหนและฉันทำเครื่องหมายว่าอะไรผิดนั่นก็ผิด

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

BTW เกือบทุกคนที่นี่ได้เลือกวิธีแรกวิธีหนึ่งที่ทำเครื่องหมายว่า "แย่ที่สุด" มีบางคนเลือกวิธีที่สองโดยระบุว่า "ตกลง" แต่ไม่มีใครก่อนหน้าฉันแสดงให้คุณเห็นวิธีการทำแบบ "ดีกว่า" หรือ "ดีที่สุด"

นี่คือโปรแกรมทดสอบที่มีสี่วิธี

#!/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;
}

เมื่อคุณสามารถให้คะแนนเหมือนกับ "ดีที่สุด" ในชุดข้อมูลนี้คุณจะรู้ว่าคุณทำอย่างถูกต้อง ก่อนหน้านั้นคุณยังไม่ได้ ไม่มีใครที่นี่ทำได้ดีไปกว่า "โอเค" และส่วนใหญ่จะทำมัน "แย่ที่สุด" ฉันหวังว่าจะเห็นใครบางคนโพสต์รหัสที่ถูกต้อง

ฉันสังเกตเห็นว่าโค้ดการไฮไลต์ของ StackOverflow นั้นน่ารำคาญอีกครั้ง พวกเขากำลังทำง่อยเก่า ๆ เหมือนกัน (ส่วนใหญ่ แต่ไม่ใช่ทั้งหมด) จากแนวทางที่น่าสงสารที่เหลือที่กล่าวถึงที่นี่ เวลาผ่านไปนานหรือไม่ที่จะให้ ASCII พักบ้าง? มันไม่สมเหตุสมผลอีกต่อไปและการแกล้งทำเป็นทุกอย่างที่คุณมีก็ผิด มันทำให้รหัสไม่ดี


คำตอบ 'ดีที่สุด' ของคุณดูเหมือนจะใกล้เคียงที่สุดแล้ว แต่ดูเหมือนว่ามันไม่ได้เป็นเพราะเครื่องหมายวรรคตอนหรือตัวอักษรอื่น ๆ ที่ไม่ใช่ตัวพิมพ์เล็ก ดูเหมือนว่าจะทำงานได้ดีที่สุดสำหรับฉัน (ใน java): replaceAll ("(? <= [^^ \\ p {javaUpperCase}]) (? = [\\ p {javaUpperCase}])", "");
Randyaa

อืมมม ฉันไม่แน่ใจว่าตัวเลขโรมันควรนับเป็นตัวพิมพ์ใหญ่ในตัวอย่างนี้ ไม่ควรนับตัวอย่าง modifer ตัวอักษรอย่างแน่นอน หากคุณไปที่ McDonalds.com คุณจะเห็นว่าเขียนขึ้นโดยไม่มีที่ว่าง
มาร์ตินบราวน์

ควรสังเกตว่าคุณจะไม่ได้รับสิ่งนี้ให้สมบูรณ์แบบ ตัวอย่างเช่นฉันต้องการเห็นตัวอย่างที่เรียงลำดับ "AlexandervonHumboldt" ซึ่งควรจะจบลงด้วยการเป็น "Alexander von Humboldt" จากนั้นมีภาษาของหลักสูตรที่ไม่มีความแตกต่างของทุนและตัวพิมพ์เล็ก
Martin Brown

4

Binary Worrier ฉันใช้โค้ดที่แนะนำของคุณและมันค่อนข้างดีฉันมีส่วนเสริมเพียงเล็กน้อยเท่านั้น:

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])แล้ว สิ่งนี้แก้ไขข้อผิดพลาดที่จะทำให้บางอย่างเช่น 'AverageNOX' กลายเป็น 'Average NO X' ซึ่งผิดอย่างเห็นได้ชัดเพราะควรอ่าน 'Average NOX'

น่าเศร้าที่นี่ยังมีข้อผิดพลาดที่ถ้าคุณมีข้อความ 'FromAStart' คุณจะได้รับ 'From AStart'

มีความคิดในการแก้ไขปัญหานี้ไหม?


บางทีสิ่งนี้จะทำงาน: char.IsUpper (text [i]) && (char.IsLower (ข้อความ [i - 1]) | | (char.IsLower (ข้อความ [i + 1])
Martin Brown

1
นี่คือสิ่งที่ถูกต้อง: if (char.IsUpper(text[i]) && !(char.IsUpper(text[i - 1]) && char.IsUpper(text[i + 1])))ผลการทดสอบ: "จากจุดเริ่มต้น", "จากเริ่มต้น", "จากจุดเริ่มต้น" แต่คุณจำเป็นต้องi < text.Length - 1อยู่ในเงื่อนไขลูปเพื่อละเว้นอักขระสุดท้ายและป้องกันข้อยกเว้นนอกช่วง
CallMeLaNN

โอ้มันก็เหมือนกัน ! (a && b) และ (! a ||! b) เนื่องจาก lower =! upper
CallMeLaNN

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

นั่นควรจะเป็น C # หรือไม่ ถ้าเป็นเช่นนั้นรายชื่อ namespace คืออะไร? คุณหมายถึง ArrayList หรือ List <string> หรือไม่
Martin Brown

รายการ <string> น่าจะใช้ได้ ขอโทษด้วยกับเรื่องนั้น.
คอรี่ฟัวย์

@Martin เขามักจะมีไวยากรณ์ที่ถูกต้องมันถูกซ่อนอยู่ใน<pre><code>code</code></pre>บล็อกแทนไวยากรณ์ Markdown ไม่จำเป็นต้องลงคะแนนเขา (ถ้าเป็นคุณ)
George Stocker

3

ตรวจสอบให้แน่ใจว่าคุณไม่ได้ใส่ช่องว่างที่จุดเริ่มต้นของสตริง แต่คุณกำลังใส่ช่องว่างระหว่างตัวพิมพ์ใหญ่ต่อเนื่องกัน คำตอบบางส่วนที่นี่ไม่ได้กล่าวถึงประเด็นใดข้อหนึ่งหรือทั้งสองข้อ มีวิธีอื่นนอกเหนือจาก regex แต่ถ้าคุณต้องการใช้ลองใช้สิ่งนี้:

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

The \Bเป็นตะกี้\bดังนั้นจึงแสดงถึงไม่มีคำขอบเขต มันหมายถึงรูปแบบการแข่งขัน "Y" ในXYzabcแต่ไม่ได้อยู่ในหรือYzabc X Yzabcในฐานะโบนัสเล็กน้อยคุณสามารถใช้สิ่งนี้กับสตริงที่มีช่องว่างในนั้นและมันจะไม่เพิ่มเป็นสองเท่า


3

Regex นี้วางอักขระเว้นวรรคไว้ด้านหน้าตัวอักษรพิมพ์ใหญ่ทุกตัว:

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
หากคุณต้องการแยกตัวเลขให้ใช้รูปแบบ regex นี้แทน:"([A-Z0-9])([a-z]*)"
Matthias Thomann

2

สิ่งที่คุณมีอยู่อย่างสมบูรณ์แบบ เพียงอย่าลืมกำหนดใหม่valueให้กับค่าตอบแทนของฟังก์ชั่นนี้

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

2

นี่คือวิธีที่คุณสามารถทำได้ใน SQL

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

แรงบันดาลใจจาก @MartinBrown สองบรรทัดของ Simple Regex ซึ่งจะแก้ไขชื่อของคุณรวมถึง Acyronyms ที่ใดก็ได้ในสตริง

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

ฉันชอบวิธีนี้ มันสั้นและเร็ว อย่างไรก็ตามคล้ายกับโซลูชันอื่น ๆ มันล้มเหลวด้วยสตริง "RegularOTs" ทุกวิธีที่ฉันลองที่นี่จะส่งคืน "Regular O Ts"
Patee Gutee

@PateeGutee OP ต้องการพื้นที่ก่อนที่จะเมืองหลวงเขาไม่ได้พูดถึงตัวย่อเรามีการแก้ไขสำหรับการผลิตใน cod
johnny 5

คุณสามารถแสดงการแก้ไขได้หรือไม่? ฉันมีสตริงเช่นนี้ในข้อมูลของฉันและมันทำให้ฉันผลลัพธ์ไม่ถูกต้อง ขอบคุณ
Patee Gutee

@PateeGutee ขออภัยฉันเข้าใจผิดในสิ่งที่คุณต้องการ พหูพจน์เป็นปัญหาที่แตกต่าง `RegularOT 'สิ่งที่คุณคาดหวังว่าจะเกิดขึ้น" Regular OTs "หรือ" Regular OT s "
johnny 5

1
@PateeGutee ฉันได้อัปเดตคำตอบสำหรับคุณแล้วฉันเชื่อว่าควรใช้งานได้
johnny 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

ใน Ruby ผ่าน Regexp:

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

1
อ๊ะขอโทษ ฉันพลาดไปแล้วว่ามันเป็นคำถาม C # เฉพาะแล้วโพสต์ที่นี่คำตอบ Ruby :(
Artem

1

ฉันใช้วิธีแก้ปัญหาที่ยอดเยี่ยมของ Kevin Strikers และเปลี่ยนเป็น VB ตั้งแต่ฉันล็อกเข้า. NET 3.5 ฉันก็ต้องเขียน IsNullOrWhiteSpace สิ่งนี้ผ่านการทดสอบทั้งหมดของเขา

<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

คำถามนี้ค่อนข้างเก่า แต่ทุกวันนี้มีห้องสมุดที่ดีใน Nuget ที่ทำสิ่งนี้ได้อย่างถูกต้องรวมถึงการแปลงอื่น ๆ เป็นข้อความที่มนุษย์อ่านได้

ตรวจสอบ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"

เพิ่งลองและลิงก์แรกก็ไม่สามารถใช้งานได้ NuGet ใช้งานได้ แต่แพ็คเกจไม่ได้รวบรวมในโซลูชันของฉัน เป็นความคิดที่ดีถ้ามันได้ผล
philw

1

Aggregateดูเหมือนว่าโอกาสที่ดีสำหรับ สิ่งนี้ได้รับการออกแบบให้อ่านง่ายไม่จำเป็นต้องรวดเร็วเป็นพิเศษ

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

0

นอกจากคำตอบของมาร์ตินบราวน์แล้วฉันก็มีปัญหากับตัวเลขเช่นกัน ตัวอย่างเช่น: "Location2" หรือ "Jan22" ควรเป็น "Location 2" และ "Jan 22" ตามลำดับ

นี่คือนิพจน์ปกติของฉันสำหรับการทำเช่นนั้นโดยใช้คำตอบของ Martin Brown:

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

นี่คือเว็บไซต์ยอดเยี่ยมสองสามแห่งสำหรับการค้นหาว่าแต่ละส่วนมีความหมายอย่างไร:

ตัววิเคราะห์นิพจน์ปกติจาก Java (แต่ทำงานได้กับ. net regex ส่วนใหญ่)

Action Script Based Analyzer

regex ดังกล่าวข้างต้นจะไม่ทำงานบนเว็บไซต์สคริปต์การดำเนินการจนกว่าคุณจะแทนที่ทั้งหมดของ\p{Ll}กับ[a-z]ที่\p{Lu}มี[A-Z]และมี\p{Nd}[0-9]


0

นี่คือทางออกของฉันตามคำแนะนำและการสร้าง Binary Worriers ในความคิดเห็นของ Richard Priddys แต่ยังคำนึงถึงว่าพื้นที่สีขาวอาจมีอยู่ในสตริงที่ให้ไว้ดังนั้นมันจะไม่เพิ่มพื้นที่สีขาวถัดจากพื้นที่สีขาวที่มีอยู่

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

สำหรับผู้ที่กำลังมองหาฟังก์ชั่น C ++ ที่ตอบคำถามเดียวกันนี้คุณสามารถใช้สิ่งต่อไปนี้ นี่คือแบบจำลองหลังจากคำตอบที่ได้รับจาก @Binary Worrier วิธีนี้จะเก็บคำย่อไว้โดยอัตโนมัติ

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;

สตริงการทดสอบที่ฉันใช้สำหรับฟังก์ชันนี้และผลลัพธ์คือ:

  • "helloWorld" -> "hello World"
  • "HelloWorld" -> "Hello World"
  • "HelloABCWorld" -> "Hello ABC World"
  • "HelloWorldABC" -> "Hello World ABC"
  • "ABCHelloWorld" -> "ABC Hello World"
  • "ABC HELLO WORLD" -> "ABC HELLO WORLD"
  • "ABCHELLOWORLD" -> "ABCHELLOWORLD"
  • "A" -> "A"

0

C #โซลูชั่นสำหรับสตริงการป้อนข้อมูลที่ประกอบด้วยเดียวของอักขระ 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 สาธิตและideone.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

นี่เป็นวิธีการแก้ปัญหาที่ละเอียดยิ่งขึ้นโดยไม่ต้องเว้นวรรคตรงหน้าคำ:

หมายเหตุ:ฉันใช้ Regex หลายตัว (ไม่รัดกุม แต่จะใช้ตัวย่อและตัวอักษรคำเดียว)

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

ผลลัพธ์นี้ "สตริงนี้มี NoSpaces แต่มีเมืองหลวง"
แอนดี้โรบินสัน

สวัสดี @AndyRobinson ขอบคุณ ฉันเปลี่ยนเป็นใช้ Regex หลายอันแทน ไม่แน่ใจว่ามีวิธีรัดกุมกว่านี้หรือไม่ แต่ใช้งานได้ในขณะนี้
CrazyTim

0

คำตอบก่อนหน้าทั้งหมดดูซับซ้อนเกินไป

ฉันมีสตริงที่มีการผสมตัวพิมพ์ใหญ่และ _ ใช้แล้ว, string.Replace () เพื่อสร้าง _, "" และใช้ต่อไปนี้เพื่อเพิ่มช่องว่างที่ตัวอักษรพิมพ์ใหญ่

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

แรงบันดาลใจจากคำตอบ Binary Worrier ฉันแกว่งไปที่นี้

นี่คือผลลัพธ์:

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

ทดสอบโดยใช้นาฬิกาจับเวลาที่ทำงานซ้ำ 10,000,000 ครั้งรวมถึงความยาวและการรวมสตริงที่หลากหลาย

โดยเฉลี่ย 50% (อาจจะมากกว่านี้) เร็วกว่าคำตอบของ Binary Worrier


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";

คำตอบที่ได้รับการยอมรับจะเกี่ยวข้องกับกรณีที่ค่าเป็นโมฆะ
Chris F Carroll

นี่เป็นการเพิ่มพื้นที่พิเศษด้านหน้าเอาท์พุทเช่น HireDate => "วันที่จ้าง" จำเป็นต้องมี final.TrimStart หรืออะไรบางอย่าง ฉันคิดว่านั่นคือสิ่งที่หนึ่งในคำตอบอื่น ๆ ชี้ไปที่ด้านล่าง แต่เนื่องจากการเรียงลำดับใหม่ฉันไม่แน่ใจว่าเขากำลังคุยกับคุณหรือไม่เนื่องจากคำตอบของเขานั้นอิงจาก RegEx
b_levitt

การจับที่ดี ... ควรเพิ่มเครื่องหมายเริ่มต้นและจุดสิ้นสุดในการทดสอบของฉัน ... ได้รับการแก้ไขแล้ว
Serj Sagan

คล้ายกับโซลูชันอื่น ๆ ที่โพสต์ที่นี่มันล้มเหลวด้วยสตริง "RegularOTs" จะส่งคืน "Regular O Ts"
Patee Gutee

ขอขอบคุณที่แสดงคำพหูพจน์ตัวย่อฉันได้รับการอัปเดตให้ใช้งานได้เช่นกัน
Serj Sagan

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.