notepad++ 正则表达式替换匹配文本的内部序列
notepad++ regular expression replace an inner sequence of matched text
如何在 Notepad++ 中维护 xxx 的同时用 "ROUND(net_price,2)=xxx AND" 替换所有出现的 "cast(net_price as decimal(9,2))=xxx AND"?这些语句与其他 AND 语句嵌套如下:
notepad++ 需要哪些查找和替换参数?
示例文本:
OR (cast(net_price as decimal(9,2))=@var2 AND cost=@var3 AND blah)
示例结果:
OR (ROUND(net_price,2)=@var2 AND cost=@var3 AND blah)
每次我尝试编写自己的正则表达式时,似乎 select 从 net_price 到最后一个 AND 的整行,我希望它 select 到第一个AND 在 net_price 之后,然后继续下一个。
我原以为 net_price.*AND
会匹配 net_price 然后匹配任何东西,直到它找到 AND。显然我错了,如果有人能解释为什么我会很感激。
- Ctrl+H
- 查找内容:
cast\((net_price) as decimal\(9,2\)\)(?==@var2 AND)
- 替换为:
ROUND\(,2\)
- 检查 环绕
- 检查 正则表达式
- 全部替换
解释:
cast\( # literally
(net_price) # group 1, "net_price"
as decimal\(9,2\)\) # literally
(?==@var2 AND) # positive lookahead, make sure we have "=@var2 AND" after
替换:
ROUND\(,2\)
屏幕截图(之前):
截图(之后):
对过于简单的问题表示歉意,我已经对其进行了编辑以反映真正更复杂的问题。发布答案以期回馈。
我应该指出示例数据可以是小数(9,2) 或浮点数,甚至小数(9,4)。所以它比搜索和替换要复杂得多。抱歉,我试图简化发帖,我过于简单了!!
事实证明正确的 reg 不是 .* 因为这是贪婪匹配,我需要使用 .*?仅匹配 net_price 之后的第一个 AND 语句。由于贪婪匹配将匹配它可以找到的最后一个模式,然后向后查找以匹配最后一个 AND。这会 select 太多的行 - 这就是我的问题所在。
因此正则表达式变为:cast\((net_price).*?\=(.*?) AND
其中:
finds cast(
finds net_price and puts it into capture group 1
non greedy scans until it finds an equals character
captures non greedily the value into group 2
finds the AND
分成 2 组 net_price 总是在第 1 组,variable/quantity 总是在第 2 组,其他的都被重写:
替换为:ROUND\(,2\)= AND
用 net_price 替换 $1(捕获组 1),用值替换 $2(捕获组 2)。
notepad++ 搜索和替换 window:
如何在 Notepad++ 中维护 xxx 的同时用 "ROUND(net_price,2)=xxx AND" 替换所有出现的 "cast(net_price as decimal(9,2))=xxx AND"?这些语句与其他 AND 语句嵌套如下:
notepad++ 需要哪些查找和替换参数?
示例文本:
OR (cast(net_price as decimal(9,2))=@var2 AND cost=@var3 AND blah)
示例结果:
OR (ROUND(net_price,2)=@var2 AND cost=@var3 AND blah)
每次我尝试编写自己的正则表达式时,似乎 select 从 net_price 到最后一个 AND 的整行,我希望它 select 到第一个AND 在 net_price 之后,然后继续下一个。
我原以为 net_price.*AND
会匹配 net_price 然后匹配任何东西,直到它找到 AND。显然我错了,如果有人能解释为什么我会很感激。
- Ctrl+H
- 查找内容:
cast\((net_price) as decimal\(9,2\)\)(?==@var2 AND)
- 替换为:
ROUND\(,2\)
- 检查 环绕
- 检查 正则表达式
- 全部替换
解释:
cast\( # literally
(net_price) # group 1, "net_price"
as decimal\(9,2\)\) # literally
(?==@var2 AND) # positive lookahead, make sure we have "=@var2 AND" after
替换:
ROUND\(,2\)
屏幕截图(之前):
截图(之后):
对过于简单的问题表示歉意,我已经对其进行了编辑以反映真正更复杂的问题。发布答案以期回馈。
我应该指出示例数据可以是小数(9,2) 或浮点数,甚至小数(9,4)。所以它比搜索和替换要复杂得多。抱歉,我试图简化发帖,我过于简单了!!
事实证明正确的 reg 不是 .* 因为这是贪婪匹配,我需要使用 .*?仅匹配 net_price 之后的第一个 AND 语句。由于贪婪匹配将匹配它可以找到的最后一个模式,然后向后查找以匹配最后一个 AND。这会 select 太多的行 - 这就是我的问题所在。
因此正则表达式变为:cast\((net_price).*?\=(.*?) AND
其中:
finds cast(
finds net_price and puts it into capture group 1
non greedy scans until it finds an equals character
captures non greedily the value into group 2
finds the AND
分成 2 组 net_price 总是在第 1 组,variable/quantity 总是在第 2 组,其他的都被重写:
替换为:ROUND\(,2\)= AND
用 net_price 替换 $1(捕获组 1),用值替换 $2(捕获组 2)。
notepad++ 搜索和替换 window: