2015-02-07 2 views
0

В моем C# победы формы проекта, у меня есть это регулярное выражение:Получение различных значений группы в регулярных выражениях разделённых квадратными скобками

^(\[00\])(\[([+-])\]\[(\d+)\]\[(\d{14})\]\[(\d+)\]\$){1,5} 

Для согласования этой строки:

[00][-][300000][20130202200417][1562000]$[-][300000][20140202200417][1562000]$ 

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

[00] 
[-][300000][20140202200417][1562000]$ 
- 
300000 
20140202200417 
1562000 

Но я хочу, чтобы второе значение, чтобы быть в отдельных группах, таких как:

[-] 
[30000] 
[20140202200417] 
[1562000] 

Таким образом, окончательный результат будет:

[00] 
[-] 
[30000] 
[20140202200417] 
[1562000] 
[-] 
[300000] 
[20140202200417] 
[1562000] 
+0

Посмотрите на Expresso (http://www.ultrapico.com/expresso.htm). Это полезный интерактивный способ работы с регулярными выражениями. – Elliveny

ответ

0

Вы можете добиться желаемого эффекта, сделав внешнюю группу non-capturing:

^(\[00\])(?:\[([+-])\]\[(\d+)\]\[(\d{14})\]\[(\d+)\]\$){1,5} 
//  ^^ 

Demo 1.

EDIT: (в ответ на редактирование вопроса)

Чтобы захватить результаты повторений {1,5} в отдельную группу под своим номером вы должны «раскатать» выражение вручную, т.е. повторять его пять раз, с вопросительным знаком после последних четырех (т.е. замените (?:...) на цепь (?:...)(?:...)?(?:...)?(?:...)?(?:...)?).

@"^(\[00\])(?:\[([+-])\]\[(\d+)\]\[(\d{14})\]\[(\d+)\]\$)(?:\[([+-])\]\[(\d+)\]\[(\d{14})\]\[(\d+)\]\$)?(?:\[([+-])\]\[(\d+)\]\[(\d{14})\]\[(\d+)\]\$)?(?:\[([+-])\]\[(\d+)\]\[(\d{14})\]\[(\d+)\]\$)?(?:\[([+-])\]\[(\d+)\]\[(\d{14})\]\[(\d+)\]\$)?" 

Выражение становится большим и даже менее читаемым, но оно делает то, что вы хотите достичь.

Demo 2.

+0

Это хорошо работает. что имеет такое же resault – Elahe

+0

@ Elahe Это сработало отлично для меня - пожалуйста, взгляните на демонстрацию, которую я добавил, которая показывает группы до и после изменения. Обратите внимание, что в обоих случаях я пропускаю группу нуль, потому что она всегда содержит полное совпадение. – dasblinkenlight

+0

Я думаю, что у меня не было права, я изменил свой вопрос, спасибо за проверку. – Elahe

0

Проверьте это:

\[(\d+|[-+])\] 

Его результат, как и хотят.

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