2013-07-15 4 views
2

Как преобразовать «ThisIsMyTestString» в «This Is My Test String» с помощью C#?Как отделить 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

Вы можете использовать Regex, как описано здесь:

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

Здесь (?<=...) является «положительным lookbehind, регулярным выражением, которое должно предшествовать совпадению. В этом случае lookbehind является «символами» от «до» z ». (?=...) - аналогичная конструкция с lookahead, где за соответствием должна следовать строка, описываемая регулярным выражением. В этом случае lookahead - «символы» a «через» z » В обоих случаях окончательное соответствие содержит один символ« A »через« Z », за которым следует« a »-« z »или один символ« a »- z ', за которым следует заглавная буква. Замена этих матчей ставит пробел между капиталом и строчными буквами

+0

+1 regex - хорошее решение здесь –

+0

thx alot. но может кто-нибудь объяснить мне, что это делает ??? – 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 бил меня с гораздо более простым решением ... но это создает меньше мусора, так что я выиграл» t удалите его.

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(); 
Смежные вопросы