我发布了这个问题的答案,其中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}}
项目,使用积极的前瞻性-还是我需要使用不同的东西?
您不需要正面前瞻,使用捕获和堆栈以及条件检查:
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。 那么我能做什么
我有以下示例文本 当我应用以下正则表达式时,当我打印第一个捕获组时,我期望以下输出 但是我最终得到的是 在我看来,由于某种原因,否定的先行部分被忽略了,因此正则表达式与整个字符串匹配。 真正让我困惑的是,积极的前瞻性正如我所期望的那样工作。例如,使用在打印第一个捕获组时返回以下内容 这是有道理的,所以我真的很困惑为什么消极的前瞻性没有正常运作。