首页 > 解决方案 > 从表达式树中解析和提取属性所需的正则表达式帮助

问题描述

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

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

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

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

谢谢坎南

标签: regexregex-group

解决方案


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

([^:(), ]+)(?::\(((?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


推荐阅读