如何结合JSON Path与正则表达式提取非C开头工号的sys_id?
提取非C开头employee_number对应的sys_id
一、JSON Path 正确写法与正则结合
你的测试JSON外层是items数组,之前的表达式存在两个问题:一是未正确定位到items数组,二是正则匹配逻辑不符合需求(你写的是匹配全数字,但需求是只要不以C开头即可)。
有效JSON Path表达式
$.items[?(@.employee_number =~ /^[^C].*/)].sys_id
正则使用说明
- JSON Path中正则需用
/包裹,语法为=~ /正则规则/,而非单引号 ^[^C]匹配字符串开头不是"C"的情况(区分大小写,若要忽略大小写可加i标志:/^[^C].*/i).*匹配后续任意长度的任意字符,覆盖所有非C开头的场景
如果工具对正向匹配支持不佳,也可以用反向排除逻辑:
$.items[?(!(@.employee_number =~ /^C.*/))].sys_id
二、XPath实现方式
若用XPath处理,需先将JSON转为XML(多数工具支持自动转换),转换后的XML结构大致如下:
<root> <items> <item> <sys_updated_on>2021-01-15 15:04:04</sys_updated_on> <sys_id>60eaa1dc47870d9132f624846d434a</sys_id> <employee_number>C89</employee_number> </item> <item> <sys_updated_on>2017-12-08 09:26:49</sys_updated_on> <sys_id>c57058e8db8689ca52c4be13961974</sys_id> <employee_number>983</employee_number> </item> <item> <sys_updated_on>2016-04-08 13:25:00</sys_updated_on> <sys_id>fd413e848716119096ca2d0ebb358e</sys_id> <employee_number>565</employee_number> </item> </items> </root>
对应的XPath表达式:
//item[not(starts-with(employee_number, 'C'))]/sys_id/text()
逻辑解释
//item选中所有item节点not(starts-with(employee_number, 'C'))过滤掉employee_number以"C"开头的item/sys_id/text()提取符合条件的item的sys_id文本内容
内容的提问来源于stack exchange,提问作者vikas
相关产品推荐
相关产品推荐

