7

我知道.net 中有几个关于正则表达式递归的问题。我可以编写一些复杂的正则表达式,但这种递归超出了我的范围,我只是无法编写它。

这是最接近我想要的问题。

第一个问题, 第二个问题

但它匹配整个字符串,我希望集合中的匹配最好是最里面的匹配,或者按某种顺序。它还匹配一个开始字符和一个结束字符。我的是 2 个字符用于打开和关闭,[!和 !]

我的输入字符串将是这样的。

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

我需要先找到最里面的部分,[!a='innertest' b='innervalue'!],然后通过我的一个表达式树对其进行评估。然后评估包含它的父级。

有人能帮忙吗?

4

1 回答 1

13

这是一个可能满足您需求的模式:

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

它将按顺序给出每个项目的最里面的项目。为了解释我的意思,给定代码:

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

它将给出以下匹配项(在组“inner”的捕获集合中):

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 回答