2012-02-08 2 views
6

Я разрабатываю приложение с использованием C# .net, в котором мне нужно, если ввод, введенный пользователем, содержит символ «-» (дефис), тогда я хочу, чтобы непосредственные соседи дефис (-), которые сцепляются, например, если пользователь вводитОбъединить соседние символы специального символа «-»

A-B-C then i want it to be replaced with ABC 
AB-CD then i want it to be replaced like BC 
ABC-D-E then i want it to be replaced like CDE 
AB-CD-K then i want it to be replaced like BC and DK both separated by keyword and 

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

Надеюсь, что я поставил проблему в ясность, но при необходимости уточнения дайте мне знать. Любая помощь будет оценена по достоинству.

Спасибо, Devjosh

+0

регулярные выражения являются ответом здесь ([AZ]) - ([AZ]) – Tom

+0

Как я могу использовать его в функциях манипуляции с строкой C#, вы бы уточнили больше @Tom – Devjosh

+0

Итак, что вы хотите 'ABC-DE'? производить? 'CD' и' DE'? Это путает – Aliostad

ответ

3

непроверенная, но это должно сделать трюк, или, по крайней мере, привести вас в правильное направление.

private string Prepare(string input) 
{ 
    StringBuilder output = new StringBuilder(); 
    char[] chars = input.ToCharArray(); 
    for (int i = 0; i < chars.Length; i++) 
    { 
     if (chars[i] == '-') 
     { 
      if (i > 0) 
      { 
       output.Append(chars[i - 1]); 
      } 
      if (++i < chars.Length) 
      { 
       output.Append(chars[i]) 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 
    return output.ToString(); 
} 

Если вы хотите, каждая пара, чтобы сформировать отдельный объект в массиве, попробуйте следующий код:

private string[] Prepare(string input) 
{ 
    List<string> output = new List<string>(); 
    char[] chars = input.ToCharArray(); 
    for (int i = 0; i < chars.Length; i++) 
    { 
     if (chars[i] == '-') 
     { 
      string o = string.Empty; 
      if (i > 0) 
      { 
       o += chars[i - 1]; 
      } 
      if (++i < chars.Length) 
      { 
       o += chars[i] 
      } 
      output.Add(o); 
     } 
    } 
    return output.ToArray(); 
} 
+0

Пожалуйста, позвольте мне проверить это и сообщит вам .... – Devjosh

+0

он работает несколько близко @zenxer, но это становится неудачным в одном случае «AB-CD-K, тогда я хочу, чтобы он был заменен как BC и DK как разные экземпляры строк» в частности – Devjosh

+0

Что вы подразумеваете под отдельными экземплярами строк? – Zenexer

1

Поправьте меня, если я ошибаюсь, но, конечно, все, что вам нужно сделать, это удалить «-»?

так:

"A-B-C".Replace("-",""); 
+0

Спасибо @steve, но мои строки введены пользователем, и нет необходимости, чтобы каждый блок содержал только символ onw, он может содержать только 2 или 3 или может содержать n таких символов, как AB-CD или ABC-DE и т. д. – Devjosh

4

Использование:

string[] input = { 
         "A-B-C", 
         "AB-CD", 
         "ABC-D-E", 
         "AB-CD-K" 
        }; 

var regex = new Regex(@"\w(?=-)|(?<=-)\w", RegexOptions.Compiled); 

var result = input.Select(s => string.Concat(regex.Matches(s) 
    .Cast<Match>().Select(m => m.Value))); 

foreach (var s in result) 
{ 
    Console.WriteLine(s); 
} 

Выход:

ABC 
BC 
CDE 
BCDK 
+0

Регулярные выражения для этого излишни. – Zenexer

+0

@Kirill Polishchuk спасибо, но это ограничивает проблему только определенным набором строк. Я хочу, чтобы общее решение не могло принять, какую комбинацию символов и - пользователь может ввести в это поле. – Devjosh

+0

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

1

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

String.Join(String.Empty, input.Split('-').Select(q => (q.Length == 0 ? String.Empty : (q.Length > 1 ? (q.First() + q.Last()).ToString() : q.First().ToString())))).Substring(((input[0] + input[1]).ToString().Contains('-') ? 0 : 1), input.Length - ((input[0] + input[1]).ToString().Contains('-') ? 0 : 1) - ((input[input.Length - 1] + input[input.Length - 2]).ToString().Contains('-') ? 0 : 1)); 

сначала разбивает строку на массив на каждом '-', то он присоединяет только первый и последний символ каждой строки (или только единственный символ, если есть только один, и он оставляет тыс пустая строка, если там ничего нет), а затем она объединяет результирующее перечислимое значение в String. Наконец, мы снимаем первую и последнюю буквы, если они не находятся в нужном диапазоне.

Я знаю, что это некрасиво, я просто говорю, что это возможно ..

Вероятно, это лучше всего использовать простой

new Regex(@"\w(?=-)|(?<=-)\w", RegexOptions.Compiled) 

, а затем работать с этим ..

EDIT @Kirill Полищука был быстрее .. его решение должно работать ..

EDIT 2

После того, как вопрос был обновлен, вот фрагмент кода, который должен сделать трюк:

 string input = "A-B-C"; 
     string s2; 
     string s3 = ""; 
     string s4 = ""; 
     var splitted = input.Split('-'); 
     foreach(string s in splitted) { 
      if (s.Length == 0) 
       s2 = String.Empty; 
      else 
       if (s.Length > 1) 
        s2 = (s.First() + s.Last()).ToString(); 
       else 
        s2 = s.First().ToString(); 
      s3 += s4 + s2; 
      s4 = " and "; 
     } 
     int beginning; 
     int end; 
     if (input.Length > 1) 
     { 
      if ((input[0] + input[1]).ToString().Contains('-')) 
       beginning = 0; 
      else 
       beginning = 1; 
      if ((input[input.Length - 1] + input[input.Length - 2]).ToString().Contains('-')) 
       end = 0; 
      else 
       end = 1; 
     } 
     else 
     { 
      if ((input[0]).ToString().Contains('-')) 
       beginning = 0; 
      else 
       beginning = 1; 
      if ((input[input.Length - 1]).ToString().Contains('-')) 
       end = 0; 
      else 
       end = 1; 
     } 
     string result = s3.Substring(beginning, s3.Length - beginning - end); 

Это не очень элегантно, но он должен работать (не тестировался, хотя ..). он работает почти так же, как однострочный выше ...

+0

Хотя эти методы кажутся элегантными, они не являются наиболее эффективными. Я, вероятно, возьму более эффективный маршрут, но это будет зависеть от приложения. Если я уже использую много регулярных выражений, почему бы не добавить еще один? – Zenexer

+0

Я обновил ответ .. – ramsesoriginal

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