如何使用Select-String正则表达式匹配特定位置的闭合大括号
问题与解决方案
需求
给定字符串:
foo } bar} } {baz}
需匹配**行首直接是闭合大括号},或行首带有一个及以上空白字符后紧跟}**的情况,目标选中第2行和第4行的}。
错误尝试
仅匹配到第2行的
},第4行未命中:"foo } bar} } {baz}" | Select-String "\n\s?}" -AllMatches原因:
\s?仅允许0或1个空白字符,第4行的}前有多个空白,超出匹配范围。仅匹配到第4行的
},第2行未命中:"foo } bar} } {baz}" | Select-String "\n\s+?}" -AllMatches原因:
\s+要求至少1个空白字符,第2行的}前无空白,不符合匹配条件。
正确实现
使用行锚点^定位行首,结合\s*匹配0个或多个空白字符,即可覆盖两种目标场景:
$targetStr = @" foo } bar} } {baz} "@ # 输出匹配到的内容 $targetStr | Select-String '^\s*}' -AllMatches | ForEach-Object { $_.Matches.Value }
执行后会输出:
} }
逻辑说明
^:匹配行首位置,确保只检查每行开头的内容;\s*:匹配0个或多个空白字符(包括空格、制表符),既兼容行首直接是}的情况,也兼容行首带多个空白的情况;}:匹配目标闭合大括号;-AllMatches:确保返回所有符合条件的匹配项;- 通过
ForEach-Object { $_.Matches.Value }提取并输出匹配到的具体内容。
内容的提问来源于stack exchange,提问作者Ralf_Reddings
相关产品推荐
相关产品推荐

