regex - 从表达式树中解析和提取属性所需的正则表达式帮助
问题描述
这是一个有效的属性树表达式(它可以是递归的):
rootProperty:(prop1, prop2, subProp1:(prop1,subSubProp1:(prop1,prop2,etc),prop3), prop3, etc)
所以实际上一个属性可以有很多属性和子属性。从这个表达式中,我想捕获以下内容:
- 根属性
- 道具1
- 道具2
- subProp1:(prop1,subSubProp1:(prop1,prop2,etc),prop3)
- 道具3
我尝试了几种方法,但无法使重复递归工作。因此寻求帮助。
谢谢坎南
解决方案
由于递归(平衡括号),这不是正则语言,因此正则表达式可能不是您所需要的。但是假设你知道你在做什么:
([^:(), ]+)(?::\(((?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
推荐阅读
- python - Django:如何将请求对象从一个视图传递到另一个视图?
- uml - UML Class-Diagrams:类继承和类之间的关系
- docker - docker内部有多少代理(nginx)层被认为太多了?
- vb.net - VB网络文本框比较值从低到高并改变颜色
- python - 如何找出图像的平均像素值,从顶部和底部扫描它?
- javascript - 如何使用javascript更改导航元素内多级手风琴菜单的子菜单的背景颜色
- python - 在仅限容器的开发环境之外运行 django `makemigrations` 的体面做法是什么
- python - Music21 乐器对象未按预期工作
- c# - 获取动态加载程序集的异常行号
- python - 如何通过单击当前图形来调用另一个图形