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

如何使用Regex提取字符串中Id、DisplayName后对应的所有匹配值?

正则方案实现

你之前的正则失效主要有两个原因:

  • \w元字符默认仅匹配ASCII范围内的字母、数字、下划线,无法覆盖日文汉字、假名、・这类全角特殊字符
  • 没有开启全局匹配模式,只能返回第一条匹配结果

你可以用以下规则实现需求:

  1. 匹配所有DisplayName对应值:
(?<=DisplayName\\?["']=>\\?["'])[^"']+

规则说明:用[^"']匹配除双引号、单引号外的所有字符,自动截断到值的结束位置,支持任意语言字符和特殊符号。
2. 匹配所有Id对应值:

(?<=Id\\?["']=>\\?["'])\d+

规则说明:Id值均为数字,直接用\d+匹配即可。

使用时开启全局匹配模式即可拿到所有结果,比如Python中用re.findall、JavaScript中给正则加/g标识。


更稳妥的结构化解析方案

你提供的字符串本质是类Hash的序列化格式,直接转成结构化对象解析比正则更稳定,不会因为转义字符变化、格式调整出现匹配错误问题,操作步骤如下:

  1. 把字符串中的=>全部替换为:,转成标准JSON格式
  2. 解析为字典对象后递归遍历所有层级,提取对应键的值即可

Python实现示例:

import json

# 原始待解析字符串
raw_str = "{\"Ancestor\"=>{\"Ancestor\"=>{\"Ancestor\"=>{\"Ancestor\"=>{\"ContextFreeName\"=>\"本\", \"DisplayName\"=>\"本\", \"Id\"=>\"465392\"}, \"ContextFreeName\"=>\"本\", \"DisplayName\"=>\"ジャンル別\", \"Id\"=>\"465610\"}, \"ContextFreeName\"=>\"ビジネス・経済\", \"DisplayName\"=>\"ビジネス・経済\", \"Id\"=>\"466282\"}, \"ContextFreeName\"=>\"経営学・キャリア・MBA\", \"DisplayName\"=>\"経営学・キャリア・MBA\", \"Id\"=>\"492076\"}, \"ContextFreeName\"=>\"経営学・キャリア・MBAの起業・開業\", \"DisplayName\"=>\"起業・開業\", \"Id\"=>\"492058\", \"IsRoot\"=>false}"

# 转换为标准JSON并解析
data = json.loads(raw_str.replace("=>", ":"))

display_names = []
ids = []

# 递归提取目标值
def extract(obj):
    if not isinstance(obj, dict):
        return
    if "DisplayName" in obj:
        display_names.append(obj["DisplayName"])
    if "Id" in obj:
        ids.append(obj["Id"])
    for val in obj.values():
        extract(val)

extract(data)
# 输出结果
# display_names: ['本', 'ジャンル別', 'ビジネス・経済', '経営学・キャリア・MBA', '起業・開業']
# ids: ['465392', '465610', '466282', '492076', '492058']

方案选择建议

临时提取数据用正则足够方便,生产环境建议使用结构化解析方案,容错率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:54:02