PowerShell正则技巧:如何提取字符串中{}包裹的JSON内容?
用PowerShell提取字符串中{}包裹的JSON内容
嘿,我来帮你搞定这个问题!你之前尝试的方法没成功,大概率是正则匹配的逻辑没考虑到JSON里可能存在的嵌套大括号,或者匹配范围没覆盖完整。下面给你两种实用的解决方案:
场景1:提取单个完整的JSON片段(支持嵌套大括号)
如果你的字符串里只有一段被{}包裹的JSON(哪怕里面有嵌套的对象),可以用支持平衡组的正则来精准匹配完整的JSON块:
# 假设你的原始字符串存在$msContent变量中 $jsonPattern = '\{[^{}]*(?:(?<Open>\{)[^{}]*(?<-Open>\})[^{}]*)*(?(Open)(?!))\}' $matchResult = [regex]::Match($msContent, $jsonPattern) if ($matchResult.Success) { # 提取到的原始JSON可能带有"这类转义引号,先替换成正常双引号 $cleanJson = $matchResult.Value -replace '"', '"' 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 '"', '"' Write-Output "提取到的JSON片段:`n$cleanJson`n---" }
为啥你之前的方法失效了?
- 你用的
\{(.*?)\}是非贪婪匹配,遇到第一个}就会停止,要是JSON里有嵌套对象(比如"subObj": {"key": "val"}),只会匹配到一半就截断了。 - 如果用
-replace的话,普通的替换逻辑也没法处理嵌套,所以必须用平衡组正则才能精准匹配完整的JSON结构。
内容的提问来源于stack exchange,提问作者Kirill Kiselev
相关产品推荐
相关产品推荐

