从表达式树中解析和提取 属性 需要正则表达式帮助

Regex help needed to parse and extract property from an expression tree

这是一个有效的 属性 树表达式(可以递归):

rootProperty:(prop1, prop2, subProp1:(prop1,subSubProp1:(prop1,prop2,etc),prop3), prop3, 等等)

所以实际上 属性 可以有很多属性和子属性。 从这个表达式中,我想捕获以下内容:

我尝试了几种方法,但无法使重复递归工作。因此寻求帮助。

谢谢 坎南

由于递归(平衡括号),这不是常规语言,因此正则表达式可能不是您所需要的。但假设您知道自己在做什么:

([^:(), ]+)(?::\(((?R)?(?:, ?(?R))*)\))?

首先我们捕获 属性 的名称:一个或多个不是 :(), 的字符。

([^:(), ]+)

一个属性可能有也可能没有子树,所以下一部分是可选的子树:

(?:           <--- do not capture
   :          <--- literal ':'
   \(         <--- literal '('
      ...     <--- some stuff inside
   \)         <--- literal ')'
)?            <--- it is optional

里面的东西捕获了一个属性列表:

(             <--- do capture
 (?R)         <--- recursively match a property
 (?:          <--- do not capture
    , ?       <--- comma followed by optional space
    (?R)      <--- recursively match another property
 )*           <--- any number of comma separated properties
)             <--- end capture

对于您的示例输入:

Input:
    rootProperty:(prop1, prop2, subProp1:(prop1,subSubProp1:(prop1,prop2,etc),prop3), prop3, etc)
Match 1:
    rootProperty:(prop1, prop2, subProp1:(prop1,subSubProp1:(prop1,prop2,etc),prop3), prop3, etc)
    Group 1:
        rootProperty
    Group 2:
        prop1, prop2, subProp1:(prop1,subSubProp1:(prop1,prop2,etc),prop3), prop3, etc

然后您可以递归地匹配每个匹配项的第二组以捕获子树的属性。应该有办法获取回溯信息,所以你不需要这样做,但我不知道如何。

Input:
    prop1, prop2, subProp1:(prop1,subSubProp1:(prop1,prop2,etc),prop3), prop3, etc
Match 1:
    prop1
Match 2:
    prop2
Match 3:
    subProp1:(prop1,subSubProp1:(prop1,prop2,etc),prop3)
    Group 1:
        subProp1
    Group 2:
        prop1,subSubProp1:(prop1,prop2,etc),prop3
Match 4:
    prop3
Match 5:
    etc

然后,

Input:
    prop1,subSubProp1:(prop1,prop2,etc),prop3
Match 1:
    prop1
Match 2:
    subSubProp1:(prop1,prop2,etc)
    Group 1:
        subSubProp1
    Group 2:
        prop1,prop2,etc
Match 3:
    prop3

最后:

Input:
    prop1,prop2,etc
Match 1:
    prop1
Match 2:
    prop2
Match 3:
    etc

https://regex101.com/r/WAXrFd/2