Regex新手求助:如何删除undo语句及其前置XML标签
解决XML脚本中删除Undo及前序标签的正则方案
嘿,作为正则新手能自己拼凑出满足需求的表达式已经很棒了!针对你要删除<undo>标签和它紧邻前一个XML标签的需求,我来给你一套实用的正则方案,专门适配你这种绘图软件导出的平级步骤XML场景。
核心思路
你的XML脚本里的绘图步骤和undo操作应该都是平级的独立标签(没有嵌套),所以用正则完全可以精准处理。我们的目标是匹配到任意一个完整的XML标签,加上它后面紧跟着的<undo>标签(不管是自闭合还是带内容的),然后把这一对都替换掉。
分场景的正则表达式
场景1:每个标签单独占一行(最常见情况)
如果你的XML导出格式是每行一个标签,比如:
<drawStep id="1">...</drawStep> <undo/> <drawStep id="2">...</drawStep> <undo>undo step 2</undo>
用这个正则(记得开启编辑器的正则表达式模式,比如VS Code里勾选替换面板的.*图标):
^(.*<[^>]+>)\s*^<undo[^>]*>(?:.*?</undo>)?$
将「替换为」框留空,直接执行替换即可。
各部分解释:
^:匹配一行的开头(.*<[^>]+>):捕获前一行的完整XML标签(不管标签名是什么,只要是合法的XML标签结构)\s*:匹配两行之间的所有空白(换行、空格、制表符都包含在内)^<undo[^>]*>:匹配undo标签的开头部分(?:.*?</undo>)?:可选匹配undo标签的闭合部分(适配带内容的<undo>...</undo>格式,?:表示非捕获组,不额外保存匹配内容)$:匹配一行的结尾
场景2:标签可能挤在同一行(少见但防万一)
如果你的XML偶尔出现标签在同一行的情况,用这个正则(需要开启单行模式,让.可以匹配换行符):
(<[^>]+>[^<]*)</?undo[^>]*>(?:</undo>)?
同样替换为空字符串即可。
操作示例(以VS Code为例)
- 打开你的XML脚本文件
- 按下
Ctrl+H(Windows)/Cmd+H(Mac)打开替换面板 - 点击面板右侧的
.*图标开启正则模式 - 把对应场景的正则表达式粘贴到「查找内容」框
- 「替换为」框保持空白
- 点击「全部替换」,就能批量清理掉所有不必要的撤销操作对了!
注意事项
- 这个方案只适用于平级无嵌套的XML结构,你的绘图步骤脚本刚好符合这个情况,完全不用担心出错;如果是复杂嵌套的XML,正则就不太适合了,但你不用考虑这种情况~
- 建议先截取一小段脚本测试替换效果,确认没问题后再批量操作。
内容的提问来源于stack exchange,提问作者Shawn T
相关产品推荐
相关产品推荐

