PowerShell拆分SQL脚本时如何跳过单引号内及@前缀的GO拆分点
解决方案
你的思路是正确的
- 你写的负向回顾断言
(?<![\S])已经完美解决了@go这类前缀带非空白字符的误拆分问题 - 要排除单引号内的GO,只需要在正则里加入单引号内容跳过规则即可,不需要复杂的逻辑改造
最终实现代码
直接替换你原来的拆分行即可:
$batches = $scriptData -split "'[^']*'(*SKIP)(*FAIL)|(?<![^\s])GO\b" | ForEach-Object { # 清理批处理内的多余换行、缩进和连续空格 $cleanContent = $_ -replace '[\r\n\t]+', ' ' -replace '\s{2,}', ' ' if ($cleanContent.Trim()) { $cleanContent.Trim() + "`r`nGO" } }
正则规则说明
'[^']*'(*SKIP)(*FAIL):匹配所有单引号包裹的内容,命中后直接标记为跳过,不参与拆分匹配,完美规避单引号内的GO被识别(?<![^\s])GO\b:你原有可用的规则,确保GO前面只能是空白字符或行首,且匹配完整的GO单词,避免@go、IdGo这类场景的误拆分
可选适配场景
- 如果你需要支持SQL里的转义单引号(即两个单引号代表一个单引号,比如
'I''m GO'),把正则第一部分调整为:'(''|[^'])*'(*SKIP)(*FAIL)即可 - 如果你需要不区分大小写匹配GO(
go/Go/gO都能作为拆分标记),给正则加不区分大小写修饰符:-split "(?i)'[^']*'(*SKIP)(*FAIL)|(?<![^\s])GO\b"
内容的提问来源于stack exchange,提问作者Raj K
相关产品推荐
相关产品推荐

