7

.netでの正規表現の再帰についていくつか質問があることを知っています。やや複雑な正規表現を書くことはできますが、この再帰は私を超えており、書くことができません。

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

最初の質問、 2番目の質問

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

入力文字列は次のようになります。

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

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

誰かがこれを手伝うことができますか?

4

1 に答える 1

13

これがあなたのニーズを満たすかもしれないパターンです:

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

各アイテムの最も内側のアイテムを順番に表示します。私が何を意味するのかを説明するために、コードを考えると:

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

次の一致が得られます(グループ「内部」のキャプチャコレクション内)。

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

したがって、の各x=yアイテムについて[! .. !]、最も内側から外側に向かって順番に一致が表示されます。

式全体もキャプチャする場合は、次のように変更できます。

^(?<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
于 2012-03-21T22:45:37.400 に答える