Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

แทรกช่องว่างระหว่างคำที่ขึ้นต้นด้วยตัวพิมพ์ใหญ่ใน C#

ปัญหา: สตริงแบบ PascalCase/CamelCase เช่น "WelcomeToMyWebsite" ต้องการแปลงเป็น "Welcome To My Website"

วิธีที่ 1: LINQ (กระชับ)

using System.Linq;

string str = "WelcomeToMyWebsite";
string spaced = string.Concat(str.Select(c => char.IsUpper(c) ? " " + c : c.ToString())).TrimStart();
// ผลลัพธ์: "Welcome To My Website"

วิธีที่ 2: Regex (ทรงพลังกว่า)

using System.Text.RegularExpressions;

string str = "WelcomeToMyWebsite";
string spaced = Regex.Replace(str, @"(?

วิธีที่ 3: Loop แบบ Manual (เข้าใจง่าย ประสิทธิ์ดี)

string AddSpaces(string input) {
    if (string.IsNullOrEmpty(input)) return input;
    
    var sb = new System.Text.StringBuilder(input.Length * 2);
    sb.Append(input[0]);
    
    for (int i = 1; i < input.Length; i++) {
        if (char.IsUpper(input[i])) {
            sb.Append(' ');
        }
        sb.Append(input[i]);
    }
    return sb.ToString();
}

ตัวอย่างครบถ้วน

using System;
using System.Linq;
using System.Text.RegularExpressions;

class Demo {
    static void Main() {
        string str = "WelcomeToMyWebsite";
        
        Console.WriteLine("Original: " + str);
        
        // LINQ
        string linqResult = string.Concat(str.Select(c => char.IsUpper(c) ? " " + c : c.ToString())).TrimStart();
        Console.WriteLine("LINQ: " + linqResult);
        
        // Regex
        string regexResult = Regex.Replace(str, @"(?

เปรียบเทียบ

วิธีข้อดีข้อเสีย
LINQกระชับ One-linerAllocate มาก (string.Concat + Select + ToString ตัวละคร)
Regexจัดการ Edge Cases ได้ดี (Acronyms, Numbers)ช้ากว่า, ต้องเข้าใจ Regex
Manual Loopเร็วที่สุด, ควบคุม Logic ได้เต็มที่โค้ดยาวกว่า

Regex ขั้นสูง: จัดการ Acronyms (XMLHttpRequest → XML Http Request)

// แทรก Space ก่อน Uppercase ที่ตามด้วย Lowercase (Boundary ของคำ)
string result = Regex.Replace(input, @"(?<=[a-z])([A-Z])|(?<=[A-Z])([A-Z][a-z])", " $1$2");