当前位置: 首页 > 知识库问答 >
问题:

带有平衡组的Regex可以处理负前瞻,但不能处理正前瞻(.net方言)

戈睿识
2023-03-14

我发布了这个问题的答案,其中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 } } } } }

正则表达式应该与层{…带有嵌套数据…}匹配,但仅限于存在foo数据元素的地方。

我在回答中的正则表达式是:

< code>layer\s*{(?

它不是明确识别包含< code>foo的匹配,而是排除那些包含< code>fee的匹配。如果所有非< code > fee -项目都是< code > foo -项目,这没问题,但另一个线程上的问题就不是这样了。我的解决方案基本上是将所有其他非< code>foo项添加到负面前瞻中,如下所示:

< code>layer\s*{(?

但是,如果您事先不知道要排除的数据项,这是不切实际的。我尝试使用积极的展望:

< code>layer\s*{(?

但这行不通。

我的问题:任何人都可以帮助我重新编写正则表达式以匹配例如层{foo{bar}}项目,使用积极的前瞻性-还是我需要使用不同的东西?

共有1个答案

柳飞飙
2023-03-14

您不需要正面前瞻,使用捕获和堆栈以及条件检查:

layer\s*{(?<f>\s*foo)?(?>{\s*foo(?<f>)(?<c>)|{(?<c>)|[^{}]+|}(?<-c>))*(?(c)(?!))(?(f)|(?!))}

查看正则表达式演示

目标点:

  • 层\s*{(?

 类似资料:
  • 我试图为PostgreSQL SQL定义lexer规则。 这里是PostgreSQL运算符的原始定义:

  • 我试图捕捉两个最接近的短语之间的文本,包括这些短语,但消极的展望似乎在我的情况下不起作用。 因此,这是文本文件的一部分: 我需要捕捉每一对<代码> 我的正则表达式是:

  • 有时候我们需要匹配后面跟着特定模式的一段模式。比如,我们要从 1 turkey costs 30€ 这段字符中匹配价格数值。 我们需要获取 € 符号前面的数值(假设价格是整数)。 那就是前瞻断言要做的事情。 前瞻断言 语法为:x(?=y),它表示 “匹配 x, 仅在后面是 y 的情况"” 那么对于一个后面跟着 € 的整数金额,它的正则表达式应该为:\d+(?=€)。 let str = "1 tu

  • 我有一个可以工作的正则表达式,但不幸的是,它不能在Java中工作,因为Java不支持这种类型的内联修饰符。 我已经阅读了有关此主题的内容,例如: Java支持条件展望 JavaRegex模式编译错误 我的正则表达式: 我还尝试了查找,但它应该匹配的模式有一个可变长度,很遗憾,这是不支持的。。。 正则表达式应该匹配所有这些模式(需要完全匹配)-- 123.342,22 123233.22 232,1

  • 我面临的一个问题是KeyedStream在workers上是纯粹并行的,因为键的数量接近并行度 我的输入记录在0-N的范围内。当我使用keyBy时,有些工人处理零个键,有些则不止一个。这是因为在中对Key.HasCode使用murmurHash并选择通道。 我知道partitionCustom可以处理这种情况,但partitionCustom只返回数据流,而不是KeyStream。 那么我能做什么

  • 我有以下示例文本 当我应用以下正则表达式时,当我打印第一个捕获组时,我期望以下输出 但是我最终得到的是 在我看来,由于某种原因,否定的先行部分被忽略了,因此正则表达式与整个字符串匹配。 真正让我困惑的是,积极的前瞻性正如我所期望的那样工作。例如,使用在打印第一个捕获组时返回以下内容 这是有道理的,所以我真的很困惑为什么消极的前瞻性没有正常运作。