2013-05-30 3 views
0

мне нужно разбить строку в C#, который отформатирован следующим образом:Что такое хороший подход для разделения этой строки на C#?

"(11) 123456 (14) абв123 (18) gt567"

С желаемым результатом является массив строк, таких как :

  • "(11) 123456"
  • "(14) абв123"
  • "(18) gt567"

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

+0

Какие критерии определяют, где должна быть разделена строка? Открытая скобка? –

+0

Почему не используется '(' для разделения? – MoCapitan

+1

var parts = text.Split ('('). Выберите (p => "(" + p) .ToArray() –

ответ

6
var result = "(11)123456(14)abc123(18)gt567" 
      .Split(new string[]{"("}, StringSplitOptions.RemoveEmptyEntries) 
      .Select(i => "(" + i).ToList(); 
+2

умный ответ, который работает намного лучше, чем альтернативы RegEx. – evanmcdonnal

+1

Это отлично подойдет для меня. Решение @Schlomo также хорошо работает, но поскольку я использую Linq, и это решение возвращает список, он получает меня (я люблю StackOverflow). –

+0

В качестве побочного я сделал небольшое изменение, чтобы устранить лишний »(« который был возвращен в качестве первого элемента в списке следующим образом: var result = (11) 123456 (14) abc123 (18) gt567 ".Split ('('). Где (i => i! =" "). Выберите (i =>" ("+ i) .ToList(); –

1

Что-то вроде:

string theString = "(11)123456(14)abc123(18)gt567"; 

Regex reSplit = new Regex(@"\(\d+\)[^\(]+"); 
var matches = reSplit.Matches(theString); 

Это даст вам коллекцию Match объектов, которые вы можете изучить.

Чтобы получить массив строк:

var splits = matches.Cast<Match>().Select(m => m.Value).ToArray(); 
+0

не забывайте, что у него есть альфа символы во втором и третьем совпадениях. – jbabey

8
var s = "(11)123456(14)abc123(18)gt567"; 

Regex r = new Regex(@"\(\d+\)\w+"); 

var matches = r.Matches(s); 

string[] array = new string[matches.Count]; 
for(int i = 0; i < matches.Count; i++) 
    array[i] = matches[i].Captures[0].Value; 
0

Вы можете использовать регулярное выражение вместе с Split method, чтобы получить массив частей.

var s = "(11)123456(14)abc123(18)gt567"; 
var pattern = new Regex(@"(\([^\(]+)"); 
var components = pattern.Split(s) 

Образец соответствует левой скобке, за которой следует любое количество символов до следующей левой скобки.

Если вам нужно иметь дело с пробелами, такими как новые линии, вам может потребоваться немного изменить шаблон or the RegexOptions.

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