You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jq捕获组结果外置需求:提取名称字段中数字前的字符串

没问题,我来帮你搞定这个jq的处理需求!针对你给出的JSON结构,我们可以利用jq的正则匹配和字符串处理能力,轻松提取name字段里数字前的内容并添加为新字段newkey。

核心解决方案

直接用这个jq命令就能实现你要的效果:

map(
  .newkey = (.name | capture("^(?<prefix>[^0-9]+)") | .prefix | rtrimstr("-"))
)

命令拆解说明

我来一步步解释每个部分的作用:

  • map(...):遍历输入的整个JSON数组,对数组里的每个对象单独处理
  • .newkey = ...:给当前对象新增一个newkey字段,值就是后面表达式计算出来的结果
  • .name | capture("^(?<prefix>[^0-9]+)"):对name字段做正则捕获,[^0-9]+会匹配从开头到第一个数字之前的所有非数字字符,(?<prefix>...)给这个匹配结果起个名字prefix,方便后续提取
  • | rtrimstr("-"):因为原name字段里数字前最后一个字符是短横线,用这个函数把末尾的-去掉,得到干净的前缀内容

测试验证

用你给的输入示例测试:
输入JSON:

[{"id":"abc", "name": "name-middlenane-lastname-1"}, {"id":"123", "name": "fname-flast-2"}]

执行命令后,输出结果完全符合你的要求:

[
  {
    "id": "abc",
    "name": "name-middlenane-lastname-1",
    "newkey": "name-middlenane-lastname"
  },
  {
    "id": "123",
    "name": "fname-flast-2",
    "newkey": "fname-flast"
  }
]

更简洁的写法

如果你的jq版本支持,还可以用sub函数直接替换掉末尾的数字部分,写法更简洁:

map(
  .newkey = (.name | sub("-\\d+$"; ""))
)

这里的正则-\\d+$会匹配末尾的-加上一串数字,然后替换成空字符串,效果和上面的命令完全一样。

内容的提问来源于stack exchange,提问作者Naveen K Reddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:51:48