使用regexc#递归地获取内部模式

本文关键字:内部 模式 获取 regexc# 递归 使用 | 更新日期: 2023-09-27 18:28:47

我知道.net中有几个关于正则表达式递归的问题。我可以写一些复杂的正则表达式,但这种递归超出了我的能力,我就是写不出来。

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

第一个问题,第二个问题。

但它匹配整个字符串,我希望集合中的匹配项最好是最内部的匹配项,或者按某种顺序。此外,它还匹配一个开头字符和一个结尾字符。我的是2个字符用于打开和关闭,[!和!]

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

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

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

有人能帮忙吗?

使用regexc#递归地获取内部模式

以下是一种可能满足您需求的模式:

^'[!((?<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