使用正则表达式批量去重捕获末尾带z的Numeric并前置到代码头部
批量自动声明末尾带z的Numeric变量(去重)
我为公司制定了一套正则处理流程,近期要优化移除无用信息。现在用Notepad++正则批量编辑程序,目前手动收集末尾带z的Numeric变量放到代码开头,但重复变量会导致编译失败,希望用正则自动捕获这些变量,去重后放到ByteCode下方。
现有查找替换规则
- 查找规则:
(Object(?s:(?!Object).)*?ByteCode :)((?s:(?!Object).)*?(?:z =.*|.*z(?:,|\)).*)(?s:.*?)EndObject)
- 替换规则:
\1\nNumeric x, x, x, x, x\nNumeric x, x, x, x, x\2
代码示例
原始代码(未添加Numeric声明)
Type : InfinityProgram LastChange : 2/18/2025 5:15:38 PM DeviceId : NetWork_MankatoO\OfcDmp\Vav5_26 Alias : RmTempSignalPRG CreateTime : 2/18/2025 5:13:20 PM CreatedBy : Root\Acc TimeLocked : 2/18/2025 5:15:38 PM InstanceId : 7227/33 ByteCode : 'ROOM TEMPERATURE CONTROL SIGNAL CALCULATIONS ' Dylan Salisbury Paape Energy Services 5/19/23 Numeric sync, lasthour Numeric actn ' control loop "action" 1 or 0 (direct or reverse) Line StartUp Goto RmHappy Line RmHappy If ((IntrLkSystemRun = On) & (TempRmAvg > (StptRoom + 1)) & (TS > 2)) then Goto RmWarm TempRmCntrlSig = 50 DamperPositionz = .5 Line RmWarm If ((IntrLkSystemRun = Off) or (TempRmAvg < StptRoom)) then Goto RmHappy TempRmCntrlSigz = PID11Fct(TempRmAvg, StptRoom, PIDTR[1], PIDTR[2], PIDTR[3], 0.5, actn, PIDTR[4], PIDTR[5], 0.5, 1, TempRmCntrlSigz, 0.005, Date) TempRmCntrlSig = (TempRmCntrlSigz * 100) DamperPositionz = .25 EndByteCode Status : Active EndObject
手动添加后的代码
Type : InfinityProgram LastChange : 2/18/2025 5:15:38 PM DeviceId : NetWork_MankatoO\OfcDmp\Vav5_26 Alias : RmTempSignalPRG CreateTime : 2/18/2025 5:13:20 PM CreatedBy : Root\Acc TimeLocked : 2/18/2025 5:15:38 PM InstanceId : 7227/33 ByteCode : Numeric ByPassDamperz, DamperPositionz, HeatingValvez, ModHumidiferz Numeric RadValveMRz, TempRmCntrlSigz, ValvePositionz, VFDSpeedPump1z 'ROOM TEMPERATURE CONTROL SIGNAL CALCULATIONS ' Dylan Salisbury Paape Energy Services 5/19/23 Numeric sync, lasthour Numeric actn ' control loop "action" 1 or 0 (direct or reverse) Line StartUp Goto RmHappy Line RmHappy If ((IntrLkSystemRun = On) & (TempRmAvg > (StptRoom + 1)) & (TS > 2)) then Goto RmWarm TempRmCntrlSig = 50 DamperPositionz = .5 Line RmWarm If ((IntrLkSystemRun = Off) or (TempRmAvg < StptRoom)) then Goto RmHappy TempRmCntrlSigz = PID11Fct(TempRmAvg, StptRoom, PIDTR[1], PIDTR[2], PIDTR[3], 0.5, actn, PIDTR[4], PIDTR[5], 0.5, 1, TempRmCntrlSigz, 0.005, Date) TempRmCntrlSig = (TempRmCntrlSigz * 100) DamperPositionz = .25 EndByteCode Status : Active EndObject
期望效果(去重后前置)
Type : InfinityProgram LastChange : 2/18/2025 5:15:38 PM DeviceId : NetWork_MankatoO\OfcDmp\Vav5_26 Alias : RmTempSignalPRG CreateTime : 2/18/2025 5:13:20 PM CreatedBy : Root\Acc TimeLocked : 2/18/2025 5:15:38 PM InstanceId : 7227/33 ByteCode : Numeric TempRmCntrlSigz, DamperPositionz 'ROOM TEMPERATURE CONTROL SIGNAL CALCULATIONS ' Dylan Salisbury Paape Energy Services 5/19/23 Numeric sync, lasthour Numeric actn ' control loop "action" 1 or 0 (direct or reverse) Line StartUp Goto RmHappy Line RmHappy If ((IntrLkSystemRun = On) & (TempRmAvg > (StptRoom + 1)) & (TS > 2)) then Goto RmWarm TempRmCntrlSig = 50 DamperPositionz = .5 Line RmWarm If ((IntrLkSystemRun = Off) or (TempRmAvg < StptRoom)) then Goto RmHappy TempRmCntrlSigz = PID11Fct(TempRmAvg, StptRoom, PIDTR[1], PIDTR[2], PIDTR[3], 0.5, actn, PIDTR[4], PIDTR[5], 0.5, 1, TempRmCntrlSigz, 0.005, Date) TempRmCntrlSig = (TempRmCntrlSigz * 100) DamperPositionz = .25 EndByteCode Status : Active EndObject
可接受的替代效果
Type : InfinityProgram LastChange : 2/18/2025 5:15:38 PM DeviceId : NetWork_MankatoO\OfcDmp\Vav5_26 Alias : RmTempSignalPRG CreateTime : 2/18/2025 5:13:20 PM CreatedBy : Root\Acc TimeLocked : 2/18/2025 5:15:38 PM InstanceId : 7227/33 ByteCode : Numeric TempRmCntrlSigz Numeric DamperPositionz 'ROOM TEMPERATURE CONTROL SIGNAL CALCULATIONS ' Dylan Salisbury Paape Energy Services 5/19/23 Numeric sync, lasthour Numeric actn ' control loop "action" 1 or 0 (direct or reverse) Line StartUp Goto RmHappy Line RmHappy If ((IntrLkSystemRun = On) & (TempRmAvg > (StptRoom + 1)) & (TS > 2)) then Goto RmWarm TempRmCntrlSig = 50 DamperPositionz = .5 Line RmWarm If ((IntrLkSystemRun = Off) or (TempRmAvg < StptRoom)) then Goto RmHappy TempRmCntrlSigz = PID11Fct(TempRmAvg, StptRoom, PIDTR[1], PIDTR[2], PIDTR[3], 0.5, actn, PIDTR[4], PIDTR[5], 0.5, 1, TempRmCntrlSigz, 0.005, Date) TempRmCntrlSig = (TempRmCntrlSigz * 100) DamperPositionz = .25 EndByteCode Status : Active EndObject
尝试过的查找替换规则
- 查找规则:
(Object(?s:(?!Object).)*?ByteCode :)((?s:(?!Object).)*?.*(?!Numeric \3).*?(?: |\(|^)([a-zA-Z0-9_]*?z)(?s:.*?)EndObject)
- 替换规则:
\1\nNumeric \3\2
解决方案
Notepad++原生正则不支持直接完成「捕获+去重+拼接插入」的全流程,分两步操作即可实现需求:
步骤1:提取并去重末尾带z的变量
- 打开目标文件,使用Notepad++的查找所有在当前文档功能,查找规则:
\b([a-zA-Z0-9_]+z)\b(?!\s*:)
- 规则说明:
\b匹配单词边界,确保只捕获完整变量名;(?!\s*:)排除ByteCode :这类带冒号的行,避免误匹配
- 查找完成后,复制所有匹配结果到剪贴板
- 粘贴到临时文本编辑器,用正则去重:
- 查找:
^(.*)$\s*^\1$(勾选「正则表达式」和「匹配换行符」) - 替换:
$1,重复点击替换直到无匹配项
- 查找:
- 将去重后的变量整理成目标格式:要么用逗号分隔成一行
Numeric var1, var2,要么每个变量单独一行Numeric var
步骤2:插入到ByteCode下方
使用正则替换将整理好的变量插入指定位置:
- 查找规则:
(ByteCode :)\r?\n
- 替换规则(把示例中的变量列表换成你整理好的内容):
\1\r\nNumeric TempRmCntrlSigz, DamperPositionz\r\n\r\n
进阶:批量处理脚本(可选)
如果需要处理大量文件,可使用Python脚本自动化完成:
import re from pathlib import Path def process_program_file(file_path): # 读取文件内容 content = Path(file_path).read_text(encoding='utf-8') # 提取所有末尾带z的变量 vars_with_z = re.findall(r'\b([a-zA-Z0-9_]+z)\b(?!\s*:)', content) # 去重并排序 unique_vars = sorted(list(set(vars_with_z))) # 生成声明行,每4个变量一行(可根据需求调整数量) decl_lines = [] chunk_size = 4 for i in range(0, len(unique_vars), chunk_size): chunk = unique_vars[i:i+chunk_size] decl_lines.append(f"Numeric {', '.join(chunk)}") # 插入到ByteCode下方 updated_content = re.sub( r'(ByteCode :)\r?\n', rf'\1\r\n{"\r\n".join(decl_lines)}\r\n\r\n', content ) # 保存修改后的文件 Path(file_path).write_text(updated_content, encoding='utf-8') # 处理单个文件示例 process_program_file("your_program_file.txt")
内容的提问来源于stack exchange,提问作者Kevin Christian
相关产品推荐
相关产品推荐

