regex - 非贪婪的正则表达式不能像我想要的那样工作(记事本++ 8.1.1)
问题描述
我在 Windows 10 上使用 Noteapd++ v8.1.1 来编辑来自游戏 Rimworld 的保存文件,以更改地图上项目的位置。
例如,我想将不同项目列表中的所有“Building”和“Building_ something ”(而不是其他的东西)从 y=104 移动到 y=103 (这里,坐标的形式为(x , 0, y),我稍微简化了代码并添加了行号):
58 <thing Class="Plant">
59 <def>Plant_TreeOak</def>
60 <id>Plant_TreeOak41339</id>
61 <pos>(100, 0, 105)</pos>
62 </thing>
63 <thing Class="Building">
64 <def>Wall</def>
65 <id>Wall28005</id>
66 <pos>(101, 0, 105)</pos>
68 </thing>
69 <thing Class="Building">
70 <def>Wall</def>
71 <id>Wall29667</id>
72 <pos>(103, 0, 105)</pos>
74 </thing>
75 <thing Class="Building">
76 <def>Wall</def>
77 <id>Wall28005</id>
78 <pos>(101, 0, 104)</pos>
80 </thing>
81 <thing Class="Building_Door">
82 <def>Door</def>
83 <id>Door642106</id>
84 <pos>(102, 0, 104)</pos>
86 </thing>
87 <thing Class="Building">
88 <def>Wall</def>
89 <id>Wall29667</id>
90 <pos>(103, 0, 104)</pos>
92 </thing>
93 <thing Class="Plant">
94 <def>Plant_Grass</def>
95 <id>Plant_Grass203219</id>
96 <pos>(104, 0, 104)</pos>
97 </thing>
(这里,在 y=105 上,我们有一棵橡树,一堵墙,什么都没有,一堵墙;在 y=104 上,我们有一堵墙,一扇门,一堵墙,草)。
我尝试找到<thing Class="Building(.*?)104\)
(单行)并将其替换为<thing Class="Building$1103\)
. 对于这个例子,第一个匹配从第 69 行开始,到第 78 行结束,而我希望它从第 75 行开始(接下来的两个匹配工作正常)。
我尝试了很多东西并寻找准确的文档无济于事(我什至找不到正则表达式引擎 Notepad++ 正在使用什么......)。实际上,我认为我并不完全理解“非贪婪”正则表达式是如何工作的。
请考虑到英语不是我的母语,所以技术英语有时对我来说很棘手。
感谢您的帮助,请记住我使用的是 Notepad++,它有时会以不同的方式处理正则表达式(例如,\)
在替换行中制作 a )
)。
解决方案
您可以找到<thing Class="Building
并匹配下面的两行,而不是在 a 之前的最后一个数字之前获取所有内容)
:
<thing Class="Building(?:_[^"]*)?">(?:\R.*){2}\R.*\(.*,\h*\K104(?=\))
替换为103
。请参阅正则表达式演示。
详情:
<thing Class="Building
- 固定字符串(?:_[^"]*)?
- 一个可选的_
字符序列,后跟零个或多个字符,而不是一个"
字符">
- 固定字符串(?:\R.*){2}
- 两条线\R
- 换行序列.*
- 除了换行符之外的 0+ 字符尽可能多\(
- 一个(
字符.*
- 除了换行符之外的 0+ 字符尽可能多,\h*
- 一个逗号和 0+ 个水平空格\K
- 匹配重置运算符丢弃到目前为止匹配的所有文本104
- 固定值(?=\))
- 下一个字符必须是)
.
推荐阅读
- php - 每个目录和子目录中的可疑 .htaccess 文件
- c# - 正则表达式捕获引号内和带/不带空格的数字
- docker - 在 docker 容器中的 apache 中为 symfony 项目设置虚拟主机
- laravel - Laravel 7,在 URL 中保留查询参数
- javascript - 如何运行函数并将输出作为图像 src javascript 返回
- javascript - 简化三路比较 a < b < c || b < c < a || c < a < b;
- centos7 - saltstack在centos7中添加自定义服务,执行cmd.run "systemctl daemon-reload"后,service.running仍然提示service is not available
- reactjs - Powerapps 嵌入到其他应用程序中
- php - 获取两个日期之间每个月的查询结果
- python - 如何使用列表理解返回第一项而不是整个列表?