2024年3月7日 星期四

[研究]Visual Studio 2019或 Notepad++ 以正規表示式來取代字串

[研究]Visual Studio 2019或 Notepad++ 以正規表示式來取代字串

2024-03-06

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

為何同時考慮 Visual Studo 和 Notepad++,因為 2 者的正規表示式用法可能不同;另外Visual Studio 中某次大量替換程式碼,居然執行到 Visual Studio 當掉,Notepad++ 又快又可跑完,所以能否順利替換和執行速度也是考慮。

********************************************************************************

Visual Studio 中,

F1 = Func1(x1,y1);

F2 = Func1(x2,y2);

Visual Studio 2019 能字串替換,變成

F1 = Func1(x1,Func2(y1));

F2 = Func1(x2,Func2(y2));

嗎? 如何做?

ChatGPT

  1. 打開你的程式碼檔案。
  2. 使用快捷鍵Ctrl + H,或者在選單列中選擇“編輯” -> “取代”來打開“取代”對話方塊。
  3. 在“尋找”方塊中輸入 Func1\((.*?),\s*(.*?)\); ,在“取代”方塊中輸入 Func1($1, Func2($2)); 。
  4. 這個正則表達式會匹配 Func1(x1,y1); 這樣的字串,並且捕獲括號內的內容作為第一個和第二個捕獲組。
  5. 在取代中, $1 表示第一個捕獲組的內容,即 x1,$2 表示第二個捕獲組的內容,即 y1。
  6. 取代的字串就是你想要的格式,即 Func1(x1,Func2(y1));。
  7. 在取代對話方塊中點擊“全部取代”或者“逐個取代”來進行取代操作。

完成後,你的程式碼就會被替換成你想要的格式了。

********************************************************************************

User

Notepad++ 能做到嗎 ?

ChatGPT

當然,以下是在Notepad++中執行此操作的步驟:

  1. 打開你的程式碼檔案。
  2. 使用快捷鍵Ctrl + H,或者在功能列中選擇“搜尋” -> “取代”以打開“搜尋和取代”對話框。
  3. 在“尋找”框中輸入 Func1\((.*?),\s*(.*?)\); ,在“取代”框中輸入 Func1($1, Func2($2)); 。
  4. 這個正則表達式將匹配 Func1(x1,y1); 這樣的字串,並捕獲括號內的內容作為第一和第二個捕獲組。
  5. 在取代中, $1 表示第一個捕獲組的內容,即 x1,$2 表示第二個捕獲組的內容,即 y1。
  6. 取代的字串即為你想要的格式,即 Func1(x1,Func2(y1));。
  7. 在對話框中點擊“全部取代”或“逐個取代”以執行取代操作。

完成後,你的程式碼將以所需的格式進行替換。

********************************************************************************

Visual Studio 中,

F1 = Func1(x1,y1);

F2 = Func1(x2,Func2(y2));

F3 = Func1(x2,y3);

Visual Studio 2019 能字符串替換,變成

F1 = Func1(x1,Func2(y1));

F2 = Func1(x2,Func2(y2));

F3 = Func1(x2,Func2(y3));

?如何做? 也就是已經套用 Func2 的不再套用,未套用的則套用


ChatGPT

在Visual Studio 2019中,要實現這樣的替換,你可以藉助正規表達式和條件替換來完成。 以下是具體步驟:

打開你的程式碼檔案。

  1. 使用快速鍵Ctrl + H,或在選單列中選擇「編輯」 -> 「取代」來開啟「取代」對話方塊。
  2. 在「尋找」方塊中輸入 Func1\((.*?),\s*(.*?)\); ,在「取代」方塊中輸入如下正規表示式取代模式:Func1\($1, (Func2\()?($2)\)?\);
  3. 這個正規表示式將匹配 Func1(x1,y1); 這樣的字串,並且捕獲括號內的內容作為第一個和第二個捕獲組。 如果第二個參數已經套用了 Func2,那麼將不再套用,如果未套用,則會套用。
  4. 點選「正規表示式」複選框以啟用正規表示式搜尋模式。
  5. 點選「全部替換」或「逐一替換」來進行替換操作。

完成後,你的程式碼將按照你期望的方式進行替換。

********************************************************************************

Visual Studio 中,

F1 = Func1(x1,y1);

F2 = Func1(x2,Func2(y2));

F3 = Func1(x3,y3);

F4 = FuncX(x4,y4);

F5 = FuncX(x5,y5);

Visual Studio 2019 能字符串替換,變成

F1 = Func1(x1,Func2(y1));

F2 = Func1(x2,Func2(y2));

F3 = Func1(x2,Func2(y3));

F4 = FuncX(x4,y4);

F5 = FuncX(x5,y5);

嗎?如何做? 

也就是添加 Func2() 是只對 Func1 中的參數,不處理 FuncX 中的參數;

另外,已經套用 Func2 的不再套用,未套用的則套用,請用繁體中文

ChatGPT

在 Visual Studio 2019 中,你可以使用正則表達式來實現這樣的替換。請按照以下步驟進行操作:

  1. 打開你的程式碼文件。
  2. 使用快捷鍵 Ctrl + H,或者在功能列中選擇“編輯” -> “取代”以打開“取代”對話方塊。
  3. 在“尋找”框中輸入 Func1\((.*?),\s*(.*?)\); ,在“取代”框中輸入以下的正則表達式替換模式:
  4. Func1\(($1), (Func2\()?($2)\)?\);
  5. 這個正則表達式會匹配 Func1(x1,y1); 這樣的字串,並且捕獲括號內的內容作為第一和第二個捕獲組。如果第二個參數已經套用了 Func2,則不再套用,如果未套用,則會套用。
  6. 點擊“正則表達式”複選框以啟用正則表達式搜索模式。
  7. 點擊“全部取代”或“逐個取代”來執行取代操作。

完成後,你的程式碼將按照你期望的方式進行替換。

command.Parameters.AddWithValue("@ID", id);

輸入 .Parameters.AddWithValue\((.*?),\s*(.*?)\); 

注意 Parameters 前面包含句點 .

換成 .Parameters.AddWithValue\(($1), (Common.MyAntiXssFilter\()?($2)\)?\);

Notepad++,因為 C# 大小寫不同,「區分大小寫」建議勾選。勾選「規則運算式」。



下圖,失敗了,ChatGPT 給的作法有問題


再次修正並測試

command.Parameters.AddWithValue("@ID", id);

輸入 .Parameters.AddWithValue\((.*?),\s*(.*?)\); 

注意 Parameters 前面包含句點 .

上次換成 .Parameters.AddWithValue\(($1), (Common.MyAntiXssFilter\()?($2)\)?\);

這次換成 .Parameters.AddWithValue\(($1), (Common.MyAntiXssFilter\()($2)\)\);

下圖,Visual Studio 2019 中編譯成功。


用 FreeFileSync 搭配 WinMerge 比對目錄,再檢視檔案內容,

原來 Parameters.AddWithValue("@AAA", aaa);
換成 Parameters.AddWithValue("@AAA", Common.MyAntiXssFilter(aaa));

但是 Parameters.AddWithValue("@AAA", Common.MyAntiXssFilter(aaa));

變成 Parameters.AddWithValue("@AAA", Common.MyAntiXssFilter(Common.MyAntiXssFilter(bbb)));

********************************************************************************

改用 Visual Studio 2019 測試

command.Parameters.AddWithValue("@ID", id);

輸入 .Parameters.AddWithValue\((.*?),\s*(.*?)\); 

注意 Parameters 前面包含句點 .

換成 .Parameters.AddWithValue\(($1), (Common.MyAntiXssFilter\()?($2)\)?\);

進行編譯,一堆錯誤,檢視替換結果,不能用,也和 Notepad++ 替換結果不同,表示 2 者的正規表示法用法並不相同。

********************************************************************************

失敗,有空再研究。

(待續)

相關

沒有留言:

張貼留言