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;
逻辑说明
regexp_replace部分:(?s)开启单行模式,让.可匹配换行符;.*scopes:\\s*定位到scopes:开头;(.*?)非贪婪捕获scopes:到下一个同级属性(如authorizationUrl:)之间的内容;- 最终仅保留
scopes块的内容,避免干扰其他部分。
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
相关产品推荐
相关产品推荐

