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

正则表达式捕获键值对:如何正确提取可选的name、age、hair字段?

正则表达式捕获问题解决

需求

提取括号内键值对中的name、age、hair字段,键值对顺序任意,部分字段可能缺失。

输入文本

[name:"larry",age:"35",hair:"brown",size:"slim"] txt [age:"39",name:"curly"] txt [size:"short",name:"moe",age:"36",hair:"black"]
[name:"zarry",age:"35",hair:"brown",size:"slim"][size:"short",name:"zoe",age:"36",hair:"black"] txt [age:"39",name:"zurly"]

当前正则表达式

\[.*?(name:\"(?<name>[^"]+)).+?(age:\"(?<age>[^"]+)).+?(hair:\"(?<hair>[^"]+)).*?\]

期望结果

group1 larry,35,brown
group2 curly,39
group3 moe,36,black
group4 zarry,35,brown
group5 zoe,36,black
group6 zurly,39

问题原因

当前正则存在两个核心问题:

  1. .+?会跨括号匹配内容——当某个括号缺失hair字段时,正则会跳过当前括号的],继续向后查找下一个括号里的hair内容,导致不同括号的字段被错误合并。
  2. 强制要求三个字段都存在,无法处理字段缺失的场景。

解决方案

调整正则逻辑,确保所有匹配都限制在单个括号内,同时允许字段可选、顺序任意:

\[
(?:[^\]]*?name:"(?<name>[^"]+)")?
(?:[^\]]*?age:"(?<age>[^"]+)")?
(?:[^\]]*?hair:"(?<hair>[^"]+)")?
[^\]]*
\]

正则说明

  • \[:匹配括号起始符
  • (?:[^\]]*?name:"(?<name>[^"]+)")?:可选匹配name字段,[^\]]*?确保只在当前括号内查找,不会跨到其他括号
  • (?:[^\]]*?age:"(?<age>[^"]+)")?:同理,可选匹配age字段
  • (?:[^\]]*?hair:"(?<hair>[^"]+)")?:同理,可选匹配hair字段
  • [^\]]*:匹配括号内剩余的无关内容
  • \]:匹配括号结束符

结果处理

捕获到每个分组的name、age、hair后,将非空字段用逗号拼接,即可得到期望的输出格式。

内容的提问来源于stack exchange,提问作者John Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:55:55