2013-02-18 4 views
3

Я хотел бы добавить пробел, если в строке содержится символ верхнего регистра или символ подчеркивания.Добавить интервал между строчными и прописными буквами?

Как это сделать?

Пример 1

Входной

ThisIsAnInputString 

выход (результат)

This Is An Input String 

Пример 2

Входной

This_Is_An_Input_String 

выход (результат)

This Is An Input String 
+0

В первом случае это немного сложно, но я бы пошел на решение ASCII, так как есть место искать разницу «U» от «u», во втором случае это просто замена символа. Если вы собираетесь использовать ascii, просто введите char по char в int, и вы его получите. Вот ссылка на фактическую таблицу ascii: http://www.dotnetperls.com/ascii-table Извините за то, что вы не дали решение, но вопрос был в том, как ... – nzic

+1

Попробуйте это для пробелов: http: // stackoverflow.com/questions/272633/add-spaces-before-capital-letters – WannaCSharp

ответ

0

Для типа ввода: ThisIsAnInputString

 string input1 = "ThisIsAnInputString"; 
     StringBuilder builder = new StringBuilder(); 

     foreach (char c in input1) 
     { 
      if (Char.IsUpper(c)) 
      { 
       builder.Append(' '); 
       builder.Append(c); 
      } 
      else 
      { 
       builder.Append(c); 
      } 
     } 

     string output = builder.ToString().Trim(); 

Для Тип входа: This_Is_An_Input_String

string input2 = "This_Is_An_Input_String"; 
string output = Regex.Replace(input2, "_([A-Z])", " $1"); 
9

Вы можете использовать регулярное выражение, которое соответствует прописной символ, за которым следует верхний регистр символа, с дополнительным подчеркиванием между:

string output = Regex.Replace(input, "([a-z])_?([A-Z])", "$1 $2"); 

Вы могли бы хотеть использовать это для обработки отдельных слов символов также:

string output = Regex.Replace(input, "(?<!^)_?([A-Z])", " $1"); 
+2

+1, я могу изменить '[az]' на '[a-zA-Z]' для обработки строк, таких как 'ThisIsATest'. –

+0

@AbeMiessler: '[a-zA-Z]?' Должен работать лучше. –

+0

Hrrm, не могли бы вы привести пример того, когда он будет работать лучше? Извините, мое регулярное выражение довольно слабое. –

0
// check if string is empty 
     if (string.IsNullOrEmpty(input)) 
      return string.Empty; 


     if (input.Contains('_')) 
     { 
      return input.Replace('_', ' '); 
     } 
     else 
     { 
      StringBuilder newString = new StringBuilder(); 
      foreach (Char char1 in input) 
      { 
       if (char.IsUpper(char1)) 
        newString.Append(new char[] { ' ', char1 }); 
       else 
        newString.Append(char1); 
      } 

      newString.Remove(0, 1); 
      return newString.ToString(); 
     } 
0
static void Main(string[] args) 
    { 
     String str = "ThisIsAnInputString"; 
     String str2 = "This_Is_An_Input_String"; 

     Console.WriteLine(str); 
     Console.WriteLine(str2); 

     StringBuilder sb = new StringBuilder(); 
     StringBuilder sb2 = new StringBuilder(); 

     str.ToCharArray().ToList().ForEach(c => sb.Append(c == '_' ? " " : char.IsLower(c) ? c.ToString() : " " + c.ToString())); 
     str2.ToCharArray().ToList().ForEach(c => sb2.Append(c == '_' ? " " : char.IsLower(c) ? c.ToString() : " " + c.ToString())); 

     str = sb.ToString().Trim(" ".ToCharArray()); 
     str2 = sb2.ToString().Trim(" ".ToCharArray()); 

     Console.WriteLine(str); 
     Console.WriteLine(str2); 



     Console.Read(); 
    } 
0

Подчеркивания:

string inputString = "This_Is_An_Input_String"; 
string resultString = inputString.Replace('_', ' '); 

Кэпиталз:

string inputString = "ThisIsAnInputString"; 
//this will put a space before all capitals that are preceded by a lowercase character 
string resultString = Regex.Replace(inputString, @"([a-z])([A-Z])", "$1 $2"); 
1

В соответствии с вашими требованиями вы хотите добавить пробел перед любой большой буквы. Это также должно применяться и для первой буквы. Все символы подчеркивания должны быть заменены пробелом. Большинство ответов здесь опускают первое пространство (до This).

var pattern = "([a-z?])[_ ]?([A-Z])"; 

var input = "ThisIsATest"; 
var output = Regex.Replace(input, pattern, "$1 $2"); 
// output = " This Is A Test" 

var input = "This_Is_A_Test"; 
var output = Regex.Replace(input, pattern, "$1 $2"); 
// output = " This Is A Test" 

var input = "ThisIsAnInputString"; 
var output = Regex.Replace(input, pattern, "$1 $2"); 
// output = " This Is An Input String" 

var input = "This_Is_An_Input_String"; 
var output = Regex.Replace(input, pattern, "$1 $2"); 
// output = " This Is An Input String" 

Если вы не хотите, дополнительного пространства в начале затем использовать TrimStart

var input = "This_Is_A_Test"; 
var output = Regex.Replace(input, pattern, "$1 $2").TrimStart(' '); 
// output = "This Is A Test" 

Edit (обновлено):

Я скомпилированный различные предложения регулярных выражений в небольшое тестовое приложение для проверки результатов:

static void Main(string[] args) 
{ 
    const string expectedResult = "This Is A Test"; 
    var samples = new string[][] 
     { 
     new [] {"This Is A Test", "This Is A Test"}, 
     new [] {"ThisIsATest", "This Is A Test"}, 
     new [] {"This_Is_A_Test", "This Is A Test"}, 
     new [] {"ThisIsA_Test", "This Is A Test"}, 
     new [] {"This_IsATest", "This Is A Test"}, 
     new [] {"_ThisIsATest", "This Is A Test"}, 
     new [] {"_This_Is_A_Test", "This Is A Test"}, 
     new [] {"Thi_s_Is_A_Test", "Thi s Is A Test"}, 
     new [] {"T hi_s_Is_A_Te s_ t", "T hi s Is A Te s t"} 
     }; 

    foreach (var input in samples) 
    { 
    Console.WriteLine(input[0] + " => " + input[1]); 

    // Guffa 1 1/9 correct. 
    Console.WriteLine("Guffa 1:   " + (Regex.Replace(input[0], @"([a-z])_?([A-Z])", "$1 $2") == input[1])); 

    // Guffa 2 4/9 correct. 
    Console.WriteLine("Guffa 2:   " + (Regex.Replace(input[0], @"(?<!^)_?([A-Z])", " $1") == input[1])); 

    // Abe Miesler 1/9 correct. 
    Console.WriteLine("Abe Miesler:  " + (Regex.Replace(input[0], @"([a-zA-Z])_?([A-Z])", "$1 $2") == input[1])); 

    // AppDeveloper 2/9 correct. (Not entirely fair since it was not meant for underscores). 
    Console.WriteLine("AppDeveloper: " + (Regex.Replace(input[0], @"_([A-Z])", " $1") == input[1])); 

    // sparky68967 1/9 correct. (Not entirely fair since it was not meant for underscores). 
    Console.WriteLine("sparky68967:  " + (Regex.Replace(input[0], @"([a-z])([A-Z])", "$1 $2") == input[1])); 

    // p.s.w.g 4/9 correct. 
    Console.WriteLine("p.s.w.g:   " + (Regex.Replace(Regex.Replace(input[0], @"([A-Z]+)([A-Z][a-z])", "$1_$2"), "_", " ") == input[1])); 

    // Sani Huttunen 1 7/9 correct. 
    Console.WriteLine("Sani Huttunen 1: " + (Regex.Replace(input[0], @"([a-z]?)[_ ]?([A-Z])", "$1 $2").TrimStart(' ') == input[1])); 

    // Sani Huttunen 2 9/9 correct. 
    Console.WriteLine("Sani Huttunen 2: " + (Regex.Replace(input[0].Replace('_', ' '), @"(?<!^)[ ]?([A-Z])", " $1").TrimStart(' ') == input[1])); 

    Console.WriteLine(); 
    } 
} 
+0

Зачем вам заменять символ '^'? – Guffa

+0

Я бы не ... Вскочил туда как-то ... :) 3 утра ... Слишком устал думать ... –

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