2013-07-15 126 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(); 
相关问题