2012-03-21 9 views
7

.netに正規表現再帰に関するいくつかの質問があることは知っています。私はやや複雑な正規表現を書くことができますが、この再帰は私を超えており、私はそれを書くことができません。regexを使って内部パターンを再帰的に取得するC#

これは私が欲しいものに最も近い質問です。

first question,second question

しかし、それは全体の文字列と一致します。私は、コレクション内のマッチを、最初に、または何らかの順序で最も内側のマッチにすることが望ましいです。また、1つの開始文字と1つの終了文字に一致します。鉱山は開閉用の2文字です。[!と!]

私の入力文字列は、このようなものになります。

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

私はinnertestセクション、最初[!a='innertest' b='innervalue'!],を見つける必要があり、その後、私の式ツリーの1つを介して、それを評価します。それを含む親のものを評価する。

誰でも助けてもらえますか?ここで

答えて

11

はあなたのニーズを満たす可能性があるパターンです:

^\[!((?<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 
+0

これはよさそうだ。あなたの助けをよろしくお願いします。私はそれを試してみるつもりです。最初にそれを評価する必要があるので、内側の最初のような順序を伝える方法があります。 –

+0

直接ではありません。それぞれのキャプチャに 'Capture.Start'と' Capture.Length'のプロパティを使うことで、どのキャプチャに他のキャプチャが含まれているかを知ることができます。しかし、それぞれの 'x = '...''がそれに含まれるものだけに依存できるならば、この順序はうまくいくはずです。 – porges

+0

それは私が望むものに非常に近いです。あなたの努力に感謝。あなたは天才でなければなりません!これについての最後の質問です。もし、[!、!]の代わりに、開始タグと終了タグを[}と{}に変更したいのであれば、\ w + = '(?!\ [!] [^'] * '|セクションの変更。私はいくつかのことを試みましたが、それをキャプチャしていませんでした。 –

関連する問題