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

PowerShell正则技巧:如何提取字符串中{}包裹的JSON内容?

用PowerShell提取字符串中{}包裹的JSON内容

嘿,我来帮你搞定这个问题!你之前尝试的方法没成功,大概率是正则匹配的逻辑没考虑到JSON里可能存在的嵌套大括号,或者匹配范围没覆盖完整。下面给你两种实用的解决方案:

场景1:提取单个完整的JSON片段(支持嵌套大括号)

如果你的字符串里只有一段被{}包裹的JSON(哪怕里面有嵌套的对象),可以用支持平衡组的正则来精准匹配完整的JSON块:

# 假设你的原始字符串存在$msContent变量中
$jsonPattern = '\{[^{}]*(?:(?<Open>\{)[^{}]*(?<-Open>\})[^{}]*)*(?(Open)(?!))\}'
$matchResult = [regex]::Match($msContent, $jsonPattern)

if ($matchResult.Success) {
    # 提取到的原始JSON可能带有&quot;这类转义引号,先替换成正常双引号
    $cleanJson = $matchResult.Value -replace '&quot;', '"'
    Write-Output "提取到的JSON内容:`n$cleanJson"
} else {
    Write-Output "没有找到匹配的JSON片段哦"
}

这个正则的核心是平衡组:用(?<Open>\{)记录每一个打开的左括号,用(?<-Open>\})抵消一个,最后(?(Open)(?!))确保所有括号都是闭合的,完美解决嵌套大括号的问题。

场景2:提取所有{}包裹的JSON片段

如果你的字符串里有多段独立的JSON,只需要把Match换成Matches来批量匹配:

$jsonPattern = '\{[^{}]*(?:(?<Open>\{)[^{}]*(?<-Open>\})[^{}]*)*(?(Open)(?!))\}'
$allMatches = [regex]::Matches($msContent, $jsonPattern)

foreach ($match in $allMatches) {
    $cleanJson = $match.Value -replace '&quot;', '"'
    Write-Output "提取到的JSON片段:`n$cleanJson`n---"
}

为啥你之前的方法失效了?

  • 你用的\{(.*?)\}是非贪婪匹配,遇到第一个}就会停止,要是JSON里有嵌套对象(比如"subObj": {"key": "val"}),只会匹配到一半就截断了。
  • 如果用-replace的话,普通的替换逻辑也没法处理嵌套,所以必须用平衡组正则才能精准匹配完整的JSON结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:54:05