Notepad++正则匹配GROUP内带值PARENT标签并实现替换
Notepad++正则替换XML中GROUP内带值PARENT标签内容
需求说明
在Notepad++中使用正则表达式完成以下操作:
- 仅匹配
<GROUP>标签对范围内,从<GROUP>起始标签到第一个带值的<PARENT>标签结束的内容,匹配不可跨多个<GROUP>标签 - 将带值
<PARENT>标签的内容替换为对应<GROUP>的NAME属性值 - 忽略空的
<PARENT/>标签
问题分析
用户原正则表达式<GROUP NAME="(.+?)">((?!GROUP).)*<PARENT>(.+?)</PARENT>存在缺陷:负向预查(?!GROUP)仅限制单个字符不包含"GROUP",无法阻止匹配跨越多个<GROUP>标签,导致错误匹配多块GROUP内容。
解决方案
查找正则表达式
<GROUP NAME="(.+?)">((?:(?!</?GROUP>|<PARENT/>).|\r?\n)*)<PARENT>(.+?)</PARENT>
替换表达式
<GROUP NAME="$1">$2<PARENT>$1</PARENT>
Notepad++操作设置
- 打开「替换」对话框(快捷键
Ctrl+H) - 切换到「正则表达式」模式
- 无需勾选「.匹配换行符」(正则已通过
|\r?\n处理跨行匹配)
正则逻辑说明
<GROUP NAME="(.+?)">:匹配<GROUP>起始标签,捕获NAME属性值到分组1,后续替换用$1引用该值((?:(?!</?GROUP>|<PARENT/>).|\r?\n)*):匹配<GROUP>内的中间内容,通过负向预查确保:- 不匹配
<GROUP>或</GROUP>标签,彻底避免跨GROUP匹配 - 不匹配空的
<PARENT/>标签,自动忽略无值的情况 |\r?\n保证跨行的标签内容能被正常匹配
- 不匹配
<PARENT>(.+?)</PARENT>:匹配带值的<PARENT>标签,捕获原有内容到分组3(替换时无需使用该分组)
效果验证
针对示例XML中的<GROUP NAME="Three">块,替换后结果为:
<GROUP NAME="Three"> <SomeTag1> <PARENT>Three</PARENT> </GROUP>
<GROUP NAME="Four">块替换后为:
<GROUP NAME="Four"> <PARENT>Four</PARENT> <OTHERTAG3/> </GROUP>
含空<PARENT/>的<GROUP NAME="One">和<GROUP NAME="Two">块不会被匹配或修改。
内容的提问来源于stack exchange,提问作者AllSolutions
相关产品推荐
相关产品推荐

