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

PostgreSQL正则表达式提取Swagger中scopes字段问题求助

问题分析

你当前使用的正则表达式E'\"([a-z]+\\.[a-z]+)\"'存在两个问题:

  • 仅匹配包含.的scope名称(如valueid.read),像value、vlimit这类不含.的scope因不符合[a-z]+\\.[a-z]+的格式要求被过滤;
  • 未限定匹配范围,可能误提取Swagger文本其他位置的字符串。
解决方案

先精准定位scopes块的内容,再提取所有符合格式的scope名称,分两种场景处理:

场景1:Scope键带转义双引号(如"valueid.read": "lorem")

使用以下PostgreSQL查询:

select unnest(regexp_matches(
  -- 提取scopes块内的所有内容,排除其他无关部分
  regexp_replace(api_spec, E'(?s).*scopes:\\s*(.*?)(?=\\n\\s*\\w+:).*', '\\1'),
  -- 匹配scopes块内所有带转义双引号的scope键
  E'\\"([a-z0-9.]+)\\"', 'g'
)) as scopes
from apis;

逻辑说明

  1. regexp_replace部分:
    • (?s)开启单行模式,让.可匹配换行符;
    • .*scopes:\\s*定位到scopes:开头;
    • (.*?)非贪婪捕获scopes:到下一个同级属性(如authorizationUrl:)之间的内容;
    • 最终仅保留scopes块的内容,避免干扰其他部分。
  2. regexp_matches部分:
    • E'\\"([a-z0-9.]+)\\"'匹配带转义双引号的scope键,[a-z0-9.]+支持小写字母、数字和.,覆盖所有scope格式;
    • 'g'开启全局匹配,提取所有符合条件的结果。

场景2:Scope键无引号(如valueid.read: "lorem")

如果你的Swagger文本中scope键没有双引号,使用以下查询:

select unnest(regexp_matches(
  regexp_replace(api_spec, E'(?s).*scopes:\\s*(.*?)(?=\\n\\s*\\w+:).*', '\\1'),
  -- 匹配scopes块内每行的缩进+scope键+冒号
  E'^\\s+([a-z0-9.]+):', 'gm'
)) as scopes
from apis;

逻辑说明

E'^\\s+([a-z0-9.]+):'匹配scopes块内每行开头的缩进+scope键+冒号,'gm'开启全局多行模式,确保每行的scope都被提取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:43:13