在PowerShell中解析IBM API Connect的YAML文件(无第三方依赖)
更简洁的PowerShell方案提取YAML中的API路径
既然不能用第三方YAML解析库,我们可以用更精准的正则匹配或者逐行处理的方式,避免多次繁琐的字符串替换。这里提供两种简洁的实现思路:
方法1:精准正则直接提取
利用正则的正向/反向预查锁定apis到plans的代码块,再直接匹配$ref后的路径值:
# 读取整个YAML文件为单字符串 $yamlContent = Get-Content -Path "C:\Users\abhi\Desktop\projects\TRYG\GitLab\APIPOC\test.yaml" -Raw # 提取apis块内所有$ref对应的路径 $apiPaths = [regex]::Matches($yamlContent, '(?<=apis:)([\s\S]+?)(?=plans:)') | ForEach-Object { [regex]::Matches($_.Groups[0].Value, '(?<=\$ref:\s*")([^"]+)') } | ForEach-Object { $_.Value } # 输出结果 $apiPaths
逻辑说明:
(?<=apis:)([\s\S]+?)(?=plans:):匹配apis:之后、plans:之前的所有内容(包括换行)- 再在这个子内容里用
(?<=\$ref:\s*")([^"]+)匹配$ref: "之后、下一个双引号之前的字符串,直接拿到路径
方法2:逐行遍历(更易读)
如果觉得正则太抽象,逐行处理的方式逻辑更直观,适合后续维护:
$lines = Get-Content -Path "C:\Users\abhi\Desktop\projects\TRYG\GitLab\APIPOC\test.yaml" $inApisBlock = $false $apiPaths = @() foreach ($line in $lines) { # 进入apis块标记 if ($line -match '^apis:') { $inApisBlock = $true continue } # 离开apis块,终止循环 if ($line -match '^plans:') { $inApisBlock = $false break } # 在apis块内时,提取$ref的路径 if ($inApisBlock -and $line -match '\$ref:\s*"([^"]+)"') { $apiPaths += $matches[1] } } # 输出结果 $apiPaths
逻辑说明:
- 遍历每一行,通过
$inApisBlock标记是否处于apis代码块内 - 进入块后,只要遇到包含
$ref的行,就用正则提取引号内的路径值 - 遇到
plans:就停止处理,避免多余计算
这两种方法都不需要多次字符串替换,代码更简洁、逻辑更清晰,而且能精准提取你需要的所有API YAML路径。
内容的提问来源于stack exchange,提问作者abhi88
相关产品推荐
相关产品推荐

