You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用正则表达式批量去重捕获末尾带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的变量

  1. 打开目标文件,使用Notepad++的查找所有在当前文档功能,查找规则:
\b([a-zA-Z0-9_]+z)\b(?!\s*:)
  • 规则说明:\b匹配单词边界,确保只捕获完整变量名;(?!\s*:)排除ByteCode :这类带冒号的行,避免误匹配
  1. 查找完成后,复制所有匹配结果到剪贴板
  2. 粘贴到临时文本编辑器,用正则去重:
    • 查找:^(.*)$\s*^\1$(勾选「正则表达式」和「匹配换行符」)
    • 替换:$1,重复点击替换直到无匹配项
  3. 将去重后的变量整理成目标格式:要么用逗号分隔成一行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:39:54