2013-04-22 6 views
1

Мой текущий регулярное выражение выглядит следующим образом:Regex захватить вторую группу параметров

(?<token>#gallery (?<id>[^#]+)#) 

Я использую это, чтобы захватить некоторую информацию.

В случае #gallery d23d23d#

Было бы greab d23d23d как groupd имени Id.

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

#gallery d23d23d foo# и получить d23d23d и foo в отдельных группах?

Мои навыки в регулярном выражении безнадежны, некоторая помощь будет оценена по достоинству.

Спасибо.

ответ

0

Если вы хотите, чтобы захватить ровно две группы используют:

(?<token>#gallery\s+(?<id>[^\s#]+)\s+(?<foo>[^\s#]+)#) 

Группа foo будет содержать вторую группу захвата. Обратите внимание на использование \s для учета пробельных символов, отличных от пробела, и использования \s+ между группами, чтобы допускалось наличие нескольких символов пробела между параметрами.

Чтобы захватить ноль, один, или две группы используют:

(?<token>#gallery(?:\s+(?<p1>[^\s#]+)(?:\s+(?<p2>[^\s#]+)(?:\s+(?<p3>[^\s#]+))?)?)?#) 

Группы p1, p2 и p3 будет содержать первые группы, когда они появляются, они не требуются для token, чтобы соответствовать.

Чтобы захватить любое количество групп (не включая ни одного) использовать

(?<token>#gallery(?:\s+(?<id>[^\s#]+))*#) 

Хотя Value групп id будет содержать только последний согласованный параметр, это Captures свойства будет содержать все остальные параметры.

+0

Тестирование на http://gskinner.com/RegExr сначала не просто захватывает одну группу, а второе просто захватывает все дополнительные как одну группу ... – shenku

+0

ммм почти нет, нет ли способа использовать третью option '(? #gallery (?: (? [^ #] +)) * #)' но есть ли каждое значение между пробелами в отдельной группе? – shenku

+0

@shenku Вы не можете поместить их в отдельную группу без явного создания для них отдельных групп, но тогда вы ограничены количеством заданных вами групп. Я предположил, что вы можете просто определить произвольно большое количество групп, следуя моему второму примеру в качестве руководства: '(? #gallery (? [^ #] +) (?: (? [^ #] +) (?: (? [^ #] +) (?: (? [^ #] +))?)?)? #) 'Будет соответствовать от 1 до 4 параметров, но, как вы можете видеть, это быстро выходит из-под контроля , –

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