如何在VS Code中用正则表达式移除XML文件中的重复元素?
移除XML根节点下重复的带name属性元素
问题场景
有如下XML文件,根元素<item>下所有带name属性的子元素(如<array>)均重复出现两次:
<item> <array name="time_entries"> <item>0</item> <item>10</item> </array> <array name="time_entries"> <item>0</item> <item>10</item> </array> <array name="game_level"> <item>0</item> <item>1</item> <item>2</item> <item>3</item> </array> <array name="game_level"> <item>0</item> <item>1</item> <item>2</item> <item>3</item> </array> </item>
现有尝试的问题
你之前使用的正则表达式<item name=".*">#...</item>存在两处核心问题:
- 目标重复元素是
<array>而非<item>,正则匹配对象错误 #...不是有效的正则通配语法,无法匹配元素内部的完整内容结构
正确的VS Code正则查找替换方案
- 打开VS Code的查找替换面板(快捷键
Ctrl+H/Cmd+H),点击面板右侧的.*按钮开启正则表达式模式 - 查找框输入以下正则:
(<array name="([^"]+)">\s*(?:<item>[^<]+<\/item>\s*)+<\/array>)(\s*\1)
- 替换框输入:
$1
- 点击「替换全部」即可移除所有重复的
<array>元素
正则逻辑说明
(<array name="([^"]+)">\s*(?:<item>[^<]+<\/item>\s*)+<\/array>):捕获第一个完整的<array>元素,匹配其name属性、内部的<item>子元素及所有空白/换行符(\s*\1):匹配后续紧跟的空白/换行,以及和第一个捕获组完全相同的重复元素- 替换为
$1即保留第一个元素,删除重复项
替换后的结果
<item> <array name="time_entries"> <item>0</item> <item>10</item> </array> <array name="game_level"> <item>0</item> <item>1</item> <item>2</item> <item>3</item> </array> </item>
内容的提问来源于stack exchange,提问作者Arfeen Yousuf
相关产品推荐
相关产品推荐

