Notepad++ 8.1.1中非贪婪正则匹配结果不符合预期求助
问题解决方法
问题根因
你开启单行模式后.会匹配换行符,非贪婪匹配.*?仅会从当前匹配起始位置向后寻找最短的满足结束条件的内容,并没有限制不能跨</thing>节点,所以会从第一个匹配到的<thing Class="Building"开始,一直匹配到最近的104),自然出现跨节点的错误匹配。
Notepad++使用的是Boost正则引擎,你可以用排除式匹配限制不跨节点解决这个问题。
操作步骤
- 按下
Ctrl+H打开替换窗口 - 勾选正则表达式选项,以下规则兼容是否勾选点匹配换行符两种场景
- 填写对应查找和替换规则:
- 查找目标:
(<thing Class="Building[^"]*">(?:(?!</thing>).)*<pos>\(\d+, 0, )104\) - 替换为:
${1}103\)
- 点击全部替换即可完成修改
规则说明
[^"]*匹配Building后的任意后缀(比如_Door),保证所有Building、Building_xxx类的节点都能被匹配到(?:(?!</thing>).)*为非捕获排除组,保证匹配内容不会跨越</thing>标签,不会出现跨节点匹配问题\(\d+, 0,匹配坐标前半部分,兼容任意x坐标值- 所有需要保留的内容都放在捕获组
${1}中,仅将末尾的104)替换为103),避免歧义与错误
验证效果
针对你提供的示例代码,该规则仅会匹配3处符合要求的坐标:
- 第78行的
(101, 0, 104) - 第84行的
(102, 0, 104) - 第90行的
(103, 0, 104)
不会匹配非Building类节点,也不会匹配y坐标不是104的Building类节点,完全符合需求。
内容的提问来源于stack exchange,提问作者oli_vi_er
相关产品推荐
相关产品推荐

