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

如何用正则可靠提取嵌套JSON中最低层级的数值类型值?

提取嵌套JSON最低层级数值的可靠方案

问题核心

原正则的缺陷在于两个点:一是匹配边界只考虑了后续有键值对的情况,漏了对象最后一个值和数组元素;二是没排除JSON字符串内容里的数字,导致误匹配。


方案一:修正正则(保留原数值匹配逻辑)

如果一定要用正则,得先解决字符串干扰问题,再调整匹配边界:

  1. 先清除字符串内容的干扰
    用正则匹配所有JSON字符串(包括转义双引号),替换成空字符串占位,避免字符串里的数字被误抓:
"(\\"|[^"])*"

把匹配到的内容替换成"",这样字符串里的:1,这类内容就被剔除了。

  1. 修正数值匹配的正则边界
    原正则的正向断言只覆盖了后续有键值对的场景,改成兼容对象结尾}、数组结尾]和下一个元素分隔符,的情况,修正后的正则:
(?<=:)\s*([+-]?\d+(?:\.\d*(?:E-?\d+)?)?)\b\s*(?=(?:,|}|]))

这个正则能匹配对象最后一个值、数组里的所有数值,同时不会碰字符串里的内容。


方案二:解析JSON后遍历(最可靠)

正则解析JSON天生有局限性,比如遇到复杂转义、嵌套结构很容易出错,最稳妥的方式是先把JSON解析成对应的数据结构,再递归遍历提取最低层级的数值。

以Python为例:

def get_bottom_numbers(obj):
    nums = []
    def traverse(item):
        # 直接判断是否是数值类型
        if isinstance(item, (int, float)):
            nums.append(item)
        # 遍历数组元素
        elif isinstance(item, list):
            for elem in item:
                traverse(elem)
        # 遍历对象的所有值
        elif isinstance(item, dict):
            for val in item.values():
                traverse(val)
    traverse(obj)
    return nums

# 示例用法
import json
test_json = '{"a": 123, "b": {"c": 45.6, "d": [78, 90.1e-2]}, "e": ":1,"}'
data = json.loads(test_json)
print(get_bottom_numbers(data))  # 输出 [123, 45.6, 78, 0.901]

这个方法完全不受字符串内容影响,能精准提取所有合法的数值类型,包括科学计数法格式的数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:40:44