【发布时间】:2017-02-05 11:52:12
【问题描述】:
我发布了this question 的答案,其中 OP 想要一个正则表达式来匹配不同的 JSON 式数据块,条件是其中一个属性具有特定值。
稍微简化一下问题 - 假设一些示例数据如下:
layer { foo { bar { baz } } qux }
layer { fee { bar { baz } } qux }
layer { foo { bar { baz foo } } qux { quux quuux } }
{}
zip { layer { zop { layer {yeehah { foo } } } } }
zip { layer{ zop { layer {yeehah { fee } } } } }
正则表达式应匹配layer { .. stuff with nested data ...},但仅适用于存在foo 数据元素的情况。
我在答案中的正则表达式是:
layer\s*{(?>{(?<c>)|[^{}](?!fee)+|}(?<-c>))*(?(c)(?!))}
这不是积极识别包含foo 的匹配项,而是排除包含fee 的匹配项。如果所有非fee-items 都是foo-items,那很好,但其他线程上的问题并非如此。我的解决方案基本上将所有其他非foo-items 添加到负前瞻中,如下所示:
layer\s*{(?>{(?<c>)|[^{}](?!fee|blah|bloh|bluh|etc)+|}(?<-c>))*(?(c)(?!))}
但如果您事先不知道要排除的数据项,这是不切实际的。我尝试使用积极的前瞻:
layer\s*{(?>{(?<c>)|[^{}](?=foo)+|}(?<-c>))*(?(c)(?!))}
但这不起作用。
我的问题:谁能帮我重新编写正则表达式以匹配例如layer { foo { bar } } 项目通过使用积极的前瞻 - 还是我需要使用不同的东西?
【问题讨论】:
标签: .net regex regex-lookarounds