从表达式树中解析和提取 属性 需要正则表达式帮助
Regex help needed to parse and extract property from an expression tree
这是一个有效的 属性 树表达式(可以递归):
rootProperty:(prop1, prop2, subProp1:(prop1,subSubProp1:(prop1,prop2,etc),prop3), prop3, 等等)
所以实际上 属性 可以有很多属性和子属性。
从这个表达式中,我想捕获以下内容:
- 根属性
- 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
这是一个有效的 属性 树表达式(可以递归):
rootProperty:(prop1, prop2, subProp1:(prop1,subSubProp1:(prop1,prop2,etc),prop3), prop3, 等等)
所以实际上 属性 可以有很多属性和子属性。 从这个表达式中,我想捕获以下内容:
- 根属性
- 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