2016-02-11 9 views
4

Я хотел бы отформатировать мою строку, чтобы сделать пробел перед каждой заглавной буквой, за которой следует небольшой символ.Строка формата на основе символов

В настоящее время я использую этот

public static string FormatCaseConvention(string text) 
{ 
    var formatted = String.Empty; 
    foreach (char letter in text) 
    { 
     if (Char.IsUpper(letter) && formatted.Length > 0) 
     { 
      formatted += " " + letter; 
     } 
     else 
     { 
      formatted += letter; 
     } 
    } 

    return formatted; 
} 

Но если вход что-то вроде "Sqldata", он возвращается как S Q L данных. Я хочу, чтобы мой форматировщик возвращал «данные SQL». Благодарю.

+0

Но вы _never_ проверить ваш следующий символ в нижнем регистре или нет? –

+0

Yeh. : P Используйте вызов регулярного выражения, чтобы проверить, является ли следующий символ строчным. (например, '[AZ] {1} [az] {1}' или что-то в этом роде – pxgamer

+0

Как вы относитесь к RegEx? – Shnugo

ответ

4

Вот RegEx подход

string Input = "SQLData"; 
string Result = Regex.Replace(Input, "[A-Z][a-z]", " $0"); //SQL Data 

Выражение: [A-Z][a-z] прописной буквы следуют маленькой буквы

+0

Это работает отлично, спасибо! –

2

после обновления

Просто измените свой код с этим, Это работает отлично.

Вы также можете проверить его here on fiddler.

public static string FormatCaseConvention(string text) 
{ 
    string text = "SQLDataABCHumaAdADScVascASCasASCasASCTumEKa"; 
    var formatted = String.Empty; 
    int i = 0; 
    var totalLeangth = text.Length; 
    foreach (char letter in text) 
    { 
     if (Char.IsUpper(letter) && i < totalLeangth - 1) 
     { 
      if (char.IsLower(text[i + 1]) && char.IsLower(text[i - 1])) 
       formatted += letter; 

      else if (char.IsLower(text[i + 1])) 
       formatted += " " + letter; 

      else 
       formatted += letter; 
     } 
     else if (i == totalLeangth - 1) 
     { 
      if (Char.IsUpper(letter) && char.IsUpper(text[i - 1])) 
       formatted += letter; 

      else if(Char.IsUpper(text[i-1]))     
       formatted += letter;     

      else     
       formatted += " " + letter;    
     } 
     else if (Char.IsLower(letter) && char.IsUpper(text[i + 1])) 
     { 
      formatted += letter + " "; 
     } 
     else 
     { 
      formatted += letter; 
     } 
     i = i + 1; 
    } 
} 
+3

Это исключает, если последний символ является верхним регистром. –

+0

изменить код, теперь этот код работает отлично –

+0

To много кода ... И вы должны использовать 'StringBuilder' вместо конкатенации. – Qwertiy

0

Это также работает в случае, если у вас есть случай, как DataSQLData

String text = "DataSQLData"; 
Regex reg = new Regex(@"[A-Z][a-z]+(?=\w*)"); 
reg.Replace(text, " $0 ").Trim().Dump(); 
+0

Кажется, что вы добавляете двойные пробелы и имеете дополнительные в начале и в конце строки ... – Qwertiy

+0

@qwertiy yes, подрезал это Теперь. – Helic

0
<Extension()> 
Public Function TurnIntoWords(Str As String, Optional Separator As String = " ") As String 
    Dim Res As New StringBuilder(If(Str.Length, Str(0), "")), Ch As Char 

    For Q As Integer = 1 To Str.Length - 2 
    Ch = Str(Q) 
    If _ 
     Char.IsUpper(Ch) _ 
     AndAlso (Char.IsLower(Str(Q - 1)) OrElse Char.IsLower(Str(Q + 1))) _ 
    Then 
     Res.Append(Separator) 
    End If 

    Res.Append(Ch) 
    Next Q 

    If Str.Length Then Res.Append(Str(Str.Length - 1)) 

    Return Res.ToString() 
End Function 
public static string TurnIntoWords(this string Str, string Separator = " ") 
{ 
    StringBuilder Res = new StringBuilder(Str.Length != 0 ? Str[0].ToString() : ""); 
    char Ch = '\0'; 

    for (int Q = 1; Q <= Str.Length - 2; Q++) 
    { 
     Ch = Str[Q]; 

     if (char.IsUpper(Ch) && (char.IsLower(Str[Q - 1]) || char.IsLower(Str[Q + 1]))) 
      Res.Append(Separator); 

     Res.Append(Ch); 
    } 

    if (Str.Length != 0) 
     Res.Append(Str[Str.Length - 1]); 

    return Res.ToString(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^