PowerShell脚本修复:MT940文件指定区段删除逻辑错误
处理MT940文件时PowerShell脚本删除区段起始位置错误的排查与修复
示例MT940文件内容
- :20:REF1234 :86:/ABCD/这是符合格式的备注 - - :20:REF5678 :86:不符合格式的备注 :90:XXX - - :20:REF9012 :86:/EFGH/另一个符合格式的条目 -
问题脚本(原错误版本)
$content = Get-Content -Path "mt940.txt" -Raw $fixedContent = $content -replace '(?s):86:(?!/..../).*?-', '' Set-Content -Path "fixed_mt940.txt" -Value $fixedContent
问题原因分析
原脚本的正则表达式(?s):86:(?!/..../).*?-存在两个核心问题:
- 起始匹配位置错误:直接从
:86:行开始匹配,没有定位到区段开头的单独-标记,导致删除时只从:86:行截断,而非整个区段。 - 边界匹配不严谨:
.*?-会匹配到第一个-,但未确保这个-是单独占一行的区段结束标记,可能误删其他包含-的内容。
修复后的正则脚本
$content = Get-Content -Path "mt940.txt" -Raw # 匹配前后单独占一行的-包裹的区段,且区段内存在:86:开头且不匹配/..../的行 $fixedContent = $content -replace '(?sm)^-$(\n(?!^-$).*?\n:86:(?!/..../).*?\n)^-$', '' Set-Content -Path "fixed_mt940.txt" -Value $fixedContent
正则逻辑说明
(?sm):启用单行模式(.匹配换行)和多行模式(^/$匹配行首行尾)^-$:匹配单独占一行的-(区段起始标记)(\n(?!^-$).*?\n:86:(?!/..../).*?\n):匹配区段内的内容,确保包含:86:开头且不符合/..../格式的行,同时跳过其他区段的-标记^-$:匹配区段结束的单独-
处理结果验证
修复后的脚本会删除第二个区段(包含不符合格式的:86:行),处理后的文件内容如下:
- :20:REF1234 :86:/ABCD/这是符合格式的备注 - - :20:REF9012 :86:/EFGH/另一个符合格式的条目 -
内容的提问来源于stack exchange,提问作者SECØND BANANA
相关产品推荐
相关产品推荐

