使用PowerShell正则提取C结构体至独立文件遇匹配异常求助
解决PowerShell提取C结构体到独立文件的问题
问题根源
你的脚本之所以把整个文件内容匹配成一个结构体,核心原因是**Get-Content默认按行读取文件,返回字符串数组**,Select-String处理该数组时会将所有行拼接成无换行的连续文本,导致你的正则错误匹配了从第一个struct到最后一个};的全部内容。
修复后的脚本
只需给Get-Content加上-Raw参数,将文件读取为单个多行字符串,让正则能正确识别跨行的结构体边界:
# 读取整个文件为包含换行的单个字符串 $file = Get-Content -Path "./types.h" -Raw # 提取所有匹配的结构体 $structs = Select-String -Pattern "struct\s*([a-zA-Z0-9_]+)\s*{\s*(?:.*?\s*)*?}\s*;" -InputObject $file -AllMatches Write-Output $structs.Matches.Count foreach($struct in $structs.Matches) { New-Item "./$($struct.groups[1]).h" -Force -Value $struct.Value }
关键修改说明
-Raw:让Get-Content保留文件原始换行格式,返回单个多行字符串,确保正则能匹配跨行的结构体内容。-AllMatches:强制Select-String返回所有匹配结果,而非仅第一个匹配项。- 正则微调:将
(?:.*\s*)*?改为(?:.*?\s*)*?,增强非贪婪匹配的可靠性,避免意外跨行匹配。
验证效果
运行修改后的脚本后,会生成两个符合预期的文件:
foo.h内容:
struct foo { int a; };
bar.h内容:
struct bar{ short i[200]; };
内容的提问来源于stack exchange,提问作者user3001150
相关产品推荐
相关产品推荐

