使用regexc#递归地获取内部模式
本文关键字:内部 模式 获取 regexc# 递归 使用 | 更新日期: 2023-09-27 18:28:47
我知道.net中有几个关于正则表达式递归的问题。我可以写一些复杂的正则表达式,但这种递归超出了我的能力,我就是写不出来。
这是最接近我想要的问题。
第一个问题,第二个问题。
但它匹配整个字符串,我希望集合中的匹配项最好是最内部的匹配项,或者按某种顺序。此外,它还匹配一个开头字符和一个结尾字符。我的是2个字符用于打开和关闭,[!和!]
我的输入字符串将是这样的。
[!a='test' b='[!a='innertest' b='innervalue'!]'!]
我需要先找到内测部分[!a='innertest' b='innervalue'!],
,然后通过我的一个表达式树对其进行求值。然后评估包含它的父对象。
有人能帮忙吗?
以下是一种可能满足您需求的模式:
^'[!((?<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