Группировка строки через запятую в скобках - PullRequest
4 голосов
/ 16 апреля 2010

Ответ на: Регулярное выражение, чтобы найти строку, включенную между двумя символами, ИСКЛЮЧАЯ разделители

Привет, я ищу шаблон регулярного выражения, который применяется к моей строке, включая скобки:

[1,2,3,4,5] [abc, ef, g] [0,2,4b, y7]
может быть чем угодно, включая слово, цифру, не слово вместе или в отдельности.

Я хочу получить группу в скобках на \[(.*?)\] но что такое шаблон регулярного выражения, который даст мне группу между скобками и строками подгруппы, разделенными запятыми, так что результат может быть следующим ??

Group1 : 1,2,3,4,5
 Group1: 1
 Group2: 2
 Group3: 3
 Group4: 4
 Group5: 5

Group2 : abc,ef,g
 Group1: abc
 Group2: ef
 Group3: g

etc ..

Спасибо за вашу помощь

Ответы [ 5 ]

6 голосов
/ 16 апреля 2010

Я согласен с @Dav, что вам лучше всего использовать String.Split для каждой группы в квадратных скобках.

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

(?:\s*\[((.*?)(?:,(.+?))*)\])+

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

var regex = new Regex(@"(?:\s*\[((.*?)(?:,(.+?))*)\])+");
var match = regex.Match(@"[1,2,3,4,5] [abc,ef,g] [0,2,4b,y7]");

for (var i = 1; i < match.Groups.Count; i++)
{
    var group = match.Groups[i];
    Console.WriteLine("Group " + i);

    for (var j = 0; j < group.Captures.Count; j++)
    {
        var capture = group.Captures[j];

        Console.WriteLine("  Capture " + j + ": " + capture.Value 
                                       + " at " + capture.Index);
    }
}

Создает следующий вывод:

Group 1
  Capture 0: 1,2,3,4,5 at 1
  Capture 1: abc,ef,g at 13
  Capture 2: 0,2,4b,y7 at 24
Group 2
  Capture 0: 1 at 1
  Capture 1: abc at 13
  Capture 2: 0 at 24
Group 3
  Capture 0: 2 at 3
  Capture 1: 3 at 5
  Capture 2: 4 at 7
  Capture 3: 5 at 9
  Capture 4: ef at 17
  Capture 5: g at 20
  Capture 6: 2 at 26
  Capture 7: 4b at 28
  Capture 8: y7 at 31

Группа 1 дает вам значение каждой группы в квадратных скобках, группа 2 дает вам первый элемент, соответствующий каждой группе в квадратных скобках, а группа 3 - все последующие элементы. Вам нужно будет просмотреть индексы снимков, чтобы определить, какой элемент принадлежит каждой группе в квадратных скобках.

3 голосов
/ 16 апреля 2010

Вот еще один вариант, который использует CaptureCollections (единственный способ сделать это в одном регулярном выражении). Там, где ответ Фила Росса делает все это в одной операции сопоставления, этот выполняет несколько сопоставлений. Таким образом, все захваты отдельных предметов правильно группируются в соответствии с парами скобок, в которых они были найдены.

string s = @"[1,2,3,4,5] [abc,ef,g] [0,2,4b,y7] ";
Regex r = new Regex(@"\[((?:([^,\[\]]+),?)*)\]");
int matchNum = 0;
foreach (Match m in r.Matches(s))
{
  Console.WriteLine("Match {0}, Group 1: {1}", ++matchNum, m.Groups[1]);
  int captureNum = 0;
  foreach (Capture c in m.Groups[2].Captures)
  {
    Console.WriteLine("  Group 2, Capture {0}: {1}", ++captureNum, c);
  }
}

выход:

Match 1, Group 1: 1,2,3,4,5
  Group 2, Capture 1: 1
  Group 2, Capture 2: 2
  Group 2, Capture 3: 3
  Group 2, Capture 4: 4
  Group 2, Capture 5: 5
Match 2, Group 1: abc,ef,g
  Group 2, Capture 1: abc
  Group 2, Capture 2: ef
  Group 2, Capture 3: g
Match 3, Group 1: 0,2,4b,y7
  Group 2, Capture 1: 0
  Group 2, Capture 2: 2
  Group 2, Capture 3: 4b
  Group 2, Capture 4: y7
2 голосов
/ 16 апреля 2010

Вам лучше использовать String.Split в своих группах, чтобы разделить их, когда у вас есть группы, разделенные скобками.

1 голос
/ 16 апреля 2010

\[(.*?)\] скажет вам, что находится в скобках, но если вы добавите:

\[(?<NumSequence>.*?)\]

Это назначит группу, на которую вы затем сможете ссылаться.

EDIT Затем я использовал бы Phil's Reg Ex, поскольку мой пример показывает, как назначить группу.

0 голосов
/ 16 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...