首页 > 解决方案 > 非贪婪的正则表达式不能像我想要的那样工作(记事本++ 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 ))。

标签: regexnotepad++non-greedy

解决方案


您可以找到<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- 固定值
  • (?=\))- 下一个字符必须是).

在此处输入图像描述


推荐阅读