はあなたのニーズを満たす可能性があるパターンです:
^\[!((?<n>\w+='\[!)|(?<inner-n>!]')|\w+='(?!\[!)[^']*'|)*!](?!(n))$
それがために、各項目の最も内側のアイテムを提供します。私はコードを与え、何を意味するかを説明するには、次の
[!a='test' c='[!x='blah'!]' b='[!a='[!y='innermost'!]' b='innervalue'!]' !]
それは(「内側」グループのためにキャプチャコレクション内の)次の一致が得られます:各x=y
項目でのために、
x='blag'
y='innermost'
a='[!y='innermost'!]' b='innervalue'
ので、 [! .. !]
、それは内側の内側から順番にマッチします。
あなたはまた、全体的な表現をキャプチャしたい場合は、このようにそれを変更することができます。
与える
^(?<n>\[!)((?<n>\w+='\[!)|(?<inner-n>!]')|\w+='(?!\[!)[^']*'|)*(?<inner-n>!])(?!(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 ...
(?<n>\w+='\[!)| # a complex x='[! .. !]' containing a nested [! .. !] - push this onto the stack 'n'
(?<inner-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
を
これはよさそうだ。あなたの助けをよろしくお願いします。私はそれを試してみるつもりです。最初にそれを評価する必要があるので、内側の最初のような順序を伝える方法があります。 –
直接ではありません。それぞれのキャプチャに 'Capture.Start'と' Capture.Length'のプロパティを使うことで、どのキャプチャに他のキャプチャが含まれているかを知ることができます。しかし、それぞれの 'x = '...''がそれに含まれるものだけに依存できるならば、この順序はうまくいくはずです。 – porges
それは私が望むものに非常に近いです。あなたの努力に感謝。あなたは天才でなければなりません!これについての最後の質問です。もし、[!、!]の代わりに、開始タグと終了タグを[}と{}に変更したいのであれば、\ w + = '(?!\ [!] [^'] * '|セクションの変更。私はいくつかのことを試みましたが、それをキャプチャしていませんでした。 –