SORU
7 Kasım 2008, Cuma


Büyük Harfler önce boşluk Ekle

Verilen string "ThisStringHasNoSpacesButİtDoesHavecapitals" büyük harflerin önce boşluk eklemek için en iyi yolu nedir. Son dize olur "Bu Dize Boşluk Var Ama Başkentleri Var"

Burada bir Düzenli ifade ile benim girişimi

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

CEVAP
7 Kasım 2008, Cuma


Bu yukarıdaki diyagram iyi (hatta Martin Browns cevap oy) çalışacak, ama pahalı (ve kişisel olarak herhangi bir desen birkaç karakter daha uzun engelleyici kalın kafalı buluyorum

Bu işlev

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 keneler içinde 100,000 kez yapacak, düzenli 25,000,000 keneler (ve düzenli derlenmiş thats) alacak.

Daha fazla kod korumak için değil ancak daha iyi, daha hızlı, yani belirli bir değer için. "Daha iyi" sık sık rekabet şartları uzlaşmadır.

Umarım bu yardımcı olur :)

Güncelleme
Bu baktım bu yana epey uzun zaman oldu, ve ben sadece zamanlama kodu değiştiğinden beri güncellenmemiş (sadece biraz değişti) fark etti.

Bir dize ile 'Abbbbbbbbb' tekrarlanan 100 kere (yani 1.000 bayt), 100.000 dönüşüm alır el kodlu işlevi 4,517,177 kene ve normal ifade altına alır 59,435,719 yapma kodlu El fonksiyonu Çalıştır 7.6% zaman alır normal ifade.

Güncelleme 2 Dikkate Kısaltmalar sürer? Olacak şimdi! Eğer ifade, bu mantığı bu genişleyen gördüğünüz gibi oldukça karanlık

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

... bir faydası yok!

Orijinali buradabasityöntem bu Kısaltmalar dert değil

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • engineerguy

    engineerguy

    10 Ocak 2010
  • Perihelion

    Perihelion

    23 NİSAN 2008
  • Samantha Crain

    Samantha Cra

    30 EKİM 2008