【问题标题】:Scala : Select the Jackson JsonNode keys using Regex filter in a jsonScala:在 json 中使用 Regex 过滤器选择 Jackson JsonNode 键
【发布时间】:2021-07-05 19:08:29
【问题描述】:

我有示例 jsonNode 数据 - Inputstr =

{
"a.b.c.d.e":"123",
"a[0].b.c.d[0].e":"123",
"a[0].b.c.d[1].e":"123",
"a[1].b.c.d[0].e":"123",
"a[1].b.c.d[1].e":"123",
"d.e.f"="789",
"x.y.z"="789"
}

我想提取具有格式数据的键 a[0-9*].b[0-9*].c[0-9*].d[0-9*].e[0-9 *]。 基本上,输出应该返回我,0 次或更多次

[ a.b.c.d.e , a[0].b.c.d[0].e, a[0].b.c.d[1].e, a[1].b.c.d[0].e, a[1].b.c.d[1].e ].

所以,我做的是

val json = ObjectMapper.readTree(Inputstr)
val itr = json.fieldNames

现在在这个键的迭代器上,我想创建一个通用的正则表达式,它返回上面的输出。

我试过了,但没用

val regex = """a\[[0-9\]]*.b\[[0-9\]]*.c\[[0-9\]]*.d\[[0-9\]]*.e\[[0-9\]]*""".r
while(itr.hasNext())
{
    val str= itr.next()
    regex.findAllIn(str)
}

我一直坚持创建基本上可以采用 [0-9]* 的正则表达式,它应该检查大括号 [] 以及大括号内是否存在从 0 到 9 的数字。即使不存在,它也应该返回我 a.b.c.d.e。

我希望这是有道理的。 如有任何问题,请告诉我。

【问题讨论】:

  • 正则表达式模式应该类似于"""a(\[[0-9]\])?\.b(\[[0-9]\])?\.c(\[[0-9]\])?\.d(\[[0-9]\])?\.e(\[[0-9]\])?""".r
  • 只是一个旁注,为了在将来简化跨段的模式更改,您还可以组装像"abcde".map(_ +: "(\\[[0-9]\\])?").mkString("\\.").r 这样的正则表达式模式。

标签: java regex scala jackson jsonnode


【解决方案1】:

a(?:\[\d])?\.b(?:\[\d])?\.c(?:\[\d])?\.d(?:\[\d])?\.e(?:\[\d])?

应该完成这项工作,我将[0] 部分包含在一个非匹配组中,该组可以使用? 来选择

【讨论】:

  • 是的,这也有效,非常感谢 :) 我会将正则表达式嵌入到我的主代码中,如果我遇到任何问题,会再次回来:) 非常感谢 :)跨度>
  • 不应该同时转义右方括号吗?
  • @TestMirror 如果第一个被转义,则不需要,但您当然可以更清楚地这样做
猜你喜欢
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
相关资源
最近更新 更多