ottenere modelli interni in modo ricorsivo usando regex c #

so che ci sono diverse domande sulla ricorsione regex in .net. Riesco a scrivere espressioni regex piuttosto complesse, ma questa ricorsione è oltre me, non sono in grado di scriverlo.

Queste sono le domande più vicine a quello che voglio.

prima domanda, seconda domanda .

ma corrisponde all’intera stringa, voglio le partite in una raccolta preferibilmente la prima partita più interna o in un certo ordine. Inoltre corrisponde a un personaggio di apertura e un carattere di chiusura. Il mio è di 2 caratteri per l’apertura e la chiusura, [! e !]

la mia stringa di input sarà qualcosa del genere.

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

Devo trovare la sezione più innervata, [!a='innertest' b='innervalue'!], Prima e poi valutarla attraverso uno dei miei alberi di espressione. quindi valutare quello principale che lo contiene.

Qualcuno può aiutare con questo?

Ecco uno schema che potrebbe soddisfare le tue esigenze:

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

Fornirà l’articolo più interno per ogni articolo in ordine. Per spiegare cosa intendo, visto il codice:

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

Darà le seguenti corrispondenze (nella collezione di cattura per il gruppo “interno”):

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

Quindi, per ogni elemento x=y in [! .. !] [! .. !] , darà le partite in ordine dall’esterno verso l’esterno.

Se vuoi anche che l’espressione generale venga catturata, puoi modificarla in questo modo:

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

Dando:

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

E per spiegare la regex:

 ^ # 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