PCRE имеет функцию, называемую рекурсивным шаблоном, которая может использоваться для соответствия вложенным подгруппам. Например, рассмотрим "грамматику"
Q -> \w | '[' A ';' Q* ','? Q* ']' | '<' A '>'
A -> (Q | ',')*
// to match ^A$.
Это можно сделать в PCRE с шаблоном
^((?:,|(\w|\[(?1);(?2)*,?(?2)*\]|<(?1)>))*)$
(Пример тестового примера: http://www.ideone.com/L4lHE)
Должно соответствовать:
abcdefg abc,def,ghi abc,,,def ,,,,,, [abc;] [a,bc;] sss[abc;d] as[abc;d,e] [abc;d,e][fgh;j,k]
<abc> [<a>b;<c,d>,<e,f>] <a,b,c> <a,bb,c> <,,,> <> <><> <>,<> a<<<<>>><a>> <<<<<>>>><><<<>>>>
<z>[a;b] <z[a;b]> [[;];] [,;,] [;[;]] [<[;]>;<[;][;,<[;,]>]>]
Не должно совпадать:
<a bc> <abc<de> [a<b;c>;d,e] [a] <<<<<>>>><><<<>>>>> <<<<<>>>><><<<>>> [abc;def;] [[;],] [;,,] [abc;d,e,f]
[<[;]>;<[;][;,<[;,]>]]> <z[a;b>]
В .NET нет рекурсивного шаблона. Вместо этого он предоставляет балансировочные группы для манипуляций на основе стека для сопоставления простых вложенных шаблонов.
Можно ли преобразовать вышеупомянутый шаблон PCRE в стиль .NET Regex?
(Да, я знаю, что лучше не использовать regex для этого. Это просто теоретический вопрос.)