簡體   English   中英

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\($1,2\)
  • 檢查環繞
  • CHECK正則表達式
  • 全部替換

解釋:

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\($1,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

它總是在第 1 組中捕獲 2 組 net_price 和始終在第 2 組中的變量/數量,其他所有內容都被重寫:

替換變為: ROUND\($1,2\)=$2 AND

它將 $1(捕獲組 1)替換為 net_price,將 $2(捕獲組 2)替換為值。

notepad++搜索替換window: notepad++ 搜索和替換窗口:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM