寻求G代码正则表达式优化:为指定行添加G4 P1且避免重复
G代码自动追加
G4 P1的逻辑优化 需求说明
当某行G代码满足以下条件时,自动在该行末尾追加G4 P1;若该行已存在G4 P1则忽略:
- 包含
M3/M4指令与带任意数字的S指令 - 支持指令间有无空格的多种格式(如
M4S10000、S10000 M4、M4 S10000、S10000M4)
现有代码问题
已有的正则表达式覆盖了指令间有无空格的匹配场景,但缺少**避免重复添加G4 P1**的逻辑:
// 初始代码 gcode = gcode.replace(/(S[0-9]* M[3-4])|(M[3-4] S[0-9]*)/g, '$& G4 P1'); // 优化后(覆盖有无空格,但仍会重复添加) gcode = gcode.replace(/(S[0-9]* M[3-4])|(M[3-4] S[0-9]*)|(M[3-4]S[0-9]*|S[0-9]*M[3-4])/g, '$& G4 P1');
多次运行上述代码时,会在已包含G4 P1的行中重复追加,产生无效冗余代码。
最终优化方案
通过负向预查结合多行匹配模式,实现精准判断与追加:
gcode = gcode.replace(/^(?!.*G4 P1).*(?:M[3-4]\s?S\d+|S\d+\s?M[3-4]).*$/gm, '$& G4 P1');
正则逻辑解析
^/$:匹配行的开头与结尾,结合gm(全局多行模式)实现逐行处理(?!.*G4 P1):负向预查,确保当前行不包含G4 P1,彻底避免重复添加(?:M[3-4]\s?S\d+|S\d+\s?M[3-4]):匹配所有M3/M4与S指令的组合格式:M[3-4]\s?S\d+:覆盖M4S10000、M4 S10000格式S\d+\s?M[3-4]:覆盖S10000M4、S10000 M4格式
.*:匹配指令前后的其他内容,确保整行符合条件时才执行追加操作
内容的提问来源于stack exchange,提问作者Jimbo Jones
相关产品推荐
相关产品推荐

