получить внутренние шаблоны рекурсивно с помощью regex c #

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

Это вопросы, наиболее близкие к тем, что я хочу.

первый вопрос, второй вопрос .

но он соответствует всей строке, я хочу, чтобы совпадения в коллекции предпочтительнее самого сокровенного совпадения сначала или в некотором порядке. Также он совпадает с одним символом открытия и одним закрывающим символом. Шахта – 2 символа для открытия и закрытия, [! а также !]

моя строка ввода будет примерно такой.

[!a='test' b='[!a='innertest' b='innervalue'!]'!] 

Сначала мне нужно найти неинтересный раздел [!a='innertest' b='innervalue'!], затем оценить его через одно из моих деревьев выражений. затем оцените родительский, содержащий его.

Может кто-нибудь помочь с этим?

Вот шаблон, который может удовлетворить ваши потребности:

 ^\[!((?\w+='\[!)|(?!]')|\w+='(?!\[!)[^']*'| )*!](?!(n))$ 

Это даст самый внутренний предмет для каждого элемента в порядке. Чтобы объяснить, что я имею в виду, учитывая код:

 [!a='test' c='[!x='blah'!]' b='[!a='[!y='innermost'!]' b='innervalue'!]' !] 

Он даст следующие совпадения (в коллекции захвата для группы «внутренний»):

 x='blag' y='innermost' a='[!y='innermost'!]' b='innervalue' 

Итак, для каждого элемента x=y в [! .. !] [! .. !] , он даст матчи в порядке от самого внутреннего наружу.

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

 ^(?\[!)((?\w+='\[!)|(?!]')|\w+='(?!\[!)[^']*'| )*(?!])(?!(n))$ 

Предоставление:

 x='blag' y='innermost' a='[!y='innermost'!]' b='innervalue' a='test' c='[!x='blag'!]' b='[!a='[!y='innermost'!]' b='innervalue'!]' 

И чтобы объяснить регулярное выражение:

 ^ # start of string \[! # start of overall [! .. !] ( # either ... (?\w+='\[!)| # a complex x='[! .. !]' containing a nested [! .. !] - push this onto the stack 'n' (?!]')| # end of a nested [! .. !] - pop stack 'n', and capture the contents into 'inner' \w+='(?!\[!)[^']*'| # a simple x='asdf' with no nested [! .. !] ) # or a space * # as many times as you want !] # the end of the overall [! .. !] (?!(n)) # assert that the 'n' stack is empty, no mismatched [! .. !] $ # end of string