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 для этого. Это просто теоретический вопрос.)