2013-07-15 132 views
2

如何使用C#將「ThisIsMyTestString」轉換爲「This Is My Test String」?如何將1個字符串分成多個字符串

有沒有一種快速的方法來做到這一點?

我一直在思考的僞代碼,但它的複雜和醜陋:

String s = "ThisIsMyTestString"; 

List<String> strList = new List<String>(); 
for(int i=0; i < str->Length ; i++) 
{ 
    String tmp = ""; 
    if (Char.IsUpper(str[i])) 
    { 
    tmp += str[i]; 
    i++; 
    } 

    while (Char::IsLower(str[i])) 
    { 
    tmp += str[i]; 
    i++; 
    } 

    strList .Add(tmp); 
} 

String tmp2 = ""; 
for (uint i=0 ; i<strList.Count(); i++) 
{ 
    tmp2 += strList[i] + " "; 
} 
+0

這裏非常類似的問題:http://stackoverflow.com/questions/291804/split-a-pascal-case-string-into-邏輯集詞 –

+0

個人我會分裂任何時候你發現一個字符是'<97' – Sayse

+3

你寫的代碼的輸出是什麼?說「它非常醜陋,我甚至不試圖修復它」表示你不願意去調試你自己的代碼。 –

回答

5

您可以使用正則表達式所列出的位置:

Regular expression, split string by capital letter but ignore TLA

您正則表達式:「((? < = [az])[AZ] | AZ)「

查找並替換爲」$ 1「

string splitString = Replace("ThisIsMyTestString", "((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))", " $1") 

這裏(?<=...)是一個「積極向後看,應該在比賽之前的正則表達式。在這種情況下,後視是「字符」通過'z'「 (?=...)是一個類似的構造與向前看,其中匹配必須跟隨正則表達式描述的字符串。在這種情況下,前視是「字符」a'到'z'「 在兩種情況下,最終匹配都包含一個字符」A「到」Z「,後跟」a「 - 」z「或者一個字符」a「 z'後跟一個大寫字母。更換這些比賽放大小寫字母

+0

+1正則表達式很好的解決方案 –

+0

thx很多。但有人可以解釋我做了什麼? – Dardar

+0

正則表達式查找從A到Z前面有字符a到z的字符,並且爲每個實例發現它將實例替換爲一個空格,然後是找到的字符 –

3

不是最好的代碼之間的空間,但它的工作原理

String.Join("", s.Select(c => Char.IsUpper(c) ? " " + c : c.ToString())).Trim() 
+2

容易理解 – Jonesopolis

+0

上一長串可能會導致記憶秒殺 –

+0

@StenPetrov在這裏完全贊同你 –

1

lazyberezovsky用更簡單的解決打我......但這個產生更少的垃圾,所以我贏了」不要刪除它。

static void Main(string[] args) 
{ 
    Console.WriteLine(SplitByCase("ThisIsMyString")); 
    Console.ReadLine(); 
} 

static string SplitByCase(string str, bool upper = true) 
{ 
    return String.Join(" ", SplitIntoWords(str, c => Char.IsUpper(c))); 
} 

static IEnumerable<String> SplitIntoWords(string str, Func<char, bool> splitter) 
{ 
    StringBuilder sb = new StringBuilder(); 

    for (int i = 0; i < str.Length; i++) 
    { 
     sb.Append(str[i]); 
     if (i + 1 == str.Length || splitter(str[i + 1])) 
     { 
      yield return sb.ToString(); 
      sb.Clear(); 
     } 
    } 
} 
0

這將做它該字符串:

  String s = "ThisIsMyTestString"; 
      StringBuilder result = new StringBuilder(); 
      result.Append(s[0]); 
      for (int i = 1; i < s.Length; i++) 
      { 
       if (char.IsUpper(s[i])) 
        result.Append(' '); 
       result.Append(s[i]); 
      } 
      s = result.ToString(); 
相關問題