要在 Notepad++ 中為每一行加上引號,最乾淨的方法是從檔案複製清單,貼到 Add Quotes to Each Line 工具中,點選符合輸出目的地的預設值,再把完成的字串貼回編輯器——整個來回過程只需幾秒鐘,就能產生正確跳脫的 JSON 陣列、SQL IN 子句或 CSV 資料列,完全不需要在 Notepad++ 內撰寫任何正規表達式。Notepad++ 本身提供了幾種在編輯器內完成這件事的方式——使用正規表達式的尋找與取代、多游標的直欄模式編輯、巨集選單,或透過外掛選單執行的 Python 或 Lua 腳本——每一種途徑最終都能產生帶引號的清單,但每一種都帶有明顯的缺陷。像是在「尋找目標」輸入 ^(.+)$、在「取代為」輸入 "$1" 的正規表達式,需要將搜尋模式切換到「正規表達式」,會依檔案最後一行是否以換行結尾而產生奇怪的行為,而且完全不進行任何跳脫處理,因此只要任何一行內含雙引號,輸出就不再是有效的 JSON;只要任何一行內含單引號,輸出就不再是有效的 SQL,儘管在畫面上看起來都沒問題。直欄模式編輯能在一次按鍵中於所有選取的行插入同一個字元,這對於重複字元確實很有用,但無法輕易地在每一行的開頭和結尾插入不同的字元而不需要額外處理,同樣也不提供跳脫功能。來回貼上的工作流程完全避開了這些問題,因為 JSON、SQL 和 CSV 的跳脫規則各不相同,而一個具備格式感知能力的引號工具會編碼成目的地格式實際要求的規則,而不是你記得的那一套。這項差異正是手動加引號幾乎總是在資料中包含引號、單引號或反斜線時就會出錯的原因。

為什麼 Notepad++ 手動加引號有其限制
最常被提到的兩種 Notepad++ 方式是開啟「正規表達式」模式的尋找與取代,以及直欄模式編輯。兩者都是通用工具,能處理許多任務;但兩者都不是專為加引號設計的,也都無法完全解決跳脫問題。
標準的正規表達式做法是在「尋找目標」欄位輸入 ^(.+)$,在「取代為」欄位輸入 "$1",並將搜尋模式設為「正規表達式」、啟用「循環」。對於純英數字 ID 或名稱的清單,輸出看起來是正確的——每一行都被雙引號包覆,清單可以直接貼到許多目標位置。但當資料中包含特殊字元時,會出現三個真正的失敗情況:
- 只要出現內嵌的雙引號,JSON 預設就會立刻失效,因為沒有進行任何跳脫,產生的字串會在一個帶引號的字串內含未跳脫的引號。
- 內嵌的單引號會因為同樣的原因而破壞 SQL 預設,因為單引號在 SQL 中也是字串結束符號,只有在重複出現時才會被視為內容。
- 最後一行是否會收到結尾引號,取決於檔案是否以換行字元結尾,而 Notepad++ 並不會標示這個差異。
直欄模式編輯在處理最後一行的問題上表現較好,因為每一個被選取的行會在同一個位置獲得相同的字元。但它一次只能插入一個字元,因此要同時為一行加上開頭和結尾引號需要兩次操作和中間的游標移動,同樣也受到跳脫功能的限制。Python 腳本或 Lua 腳本外掛可以乾淨地完成這項工作,但必須先安裝外掛、撰寫腳本,並記住選單路徑以供下次使用——對於一次性的加引號任務來說,手續過於繁瑣。
來回貼上工作流程的三個步驟
對於一次性的加引號任務,最快的方式是從 Notepad++ 複製清單,貼到瀏器工具中,點選預設值,再把結果貼回來。整個來回過程只需幾秒鐘,就能產生已經符合目的地格式跳脫規則的輸出。
- 在瀏覽器分頁中開啟 Add Quotes to Each Line 工具。切換到 Notepad++,選取值的清單,並用 Ctrl + C 複製。切換回瀏覽器,點擊輸入區域,用 Ctrl + V 貼上。工具只需要每行一個項目。
- 點選符合輸出目的地的預設值。共有四個預設可選:JSON array 會將清單包在方括號中,並以逗號連接元素;SQL IN clause 會將清單包在括號中,並以逗號連接元素;CSV row 會將每個值包在雙引號中,並以逗號連接成一行;plain quotes 會用所選的引號字元包覆每一行並以逗號連接,但不加外圍括號。
- 視需要微調結果,然後複製並貼回 Notepad++。每個預設都提供相同的可選控制項:引號字元、結尾分隔符切換(預設為關閉,這樣 JSON 陣列才不會以多餘的逗號結尾)、跳脫開啟或關閉、跳過空行、以及每行去除空白。輸出下方的狀態列會顯示已處理的行數。用 Ctrl + C 複製結果,回到 Notepad++,用 Ctrl + V 貼上。
每個預設如何包覆行內容
四個預設在三個地方有所不同:引號字元、對內嵌引號字元套用的規則,以及外圍標點符號。下表一次呈現這三項差異。
| 預設 | 引號字元 | 內嵌引號規則 | 外圍括號 | 參考 |
|---|---|---|---|---|
| JSON array | " | 反斜線跳脫:" 變成 \" | [ ... ] | RFC 8259 |
| SQL IN clause | ' | 單引號重複:' 變成 '' | ( ... ) | PostgreSQL docs |
| CSV row | " | 雙引號重複:" 變成 "" | 無 | RFC 4180 |
| Plain quotes | 使用者自選 | 可切換 | 無 | — |
這個表格的重點在於,每個預設以不同的方式包覆相同的輸入,而差異就存在於右側三個欄位中。將 JSON 輸出貼到 SQL 主控台,反斜線會以字面字元出現。將 SQL 輸出貼到 JSON 解析器,重複的單引號會被視為字串的一部分,而不是跳脫。將 CSV 輸出貼到 JSON 解析器,重複的雙引號會被讀為兩個連續的引號,而不是跳脫序列。選擇符合目標格式的正確預設,是獲得語法有效而非僅「看起來正確」之輸出的唯一方法。
當跳脫規則與你記得的不同時
跳脫規則是最常見的失敗點,因為大多數開發者腦中只記住一套規則,並假設它適用於所有地方。三個具體的例子說明了這個差異。
一行包含 O'Brien 的內容放在雙引號內看起來沒問題:"O'Brien"。如果沒有將單引號重複就放入 SQL 字串常值中,解析器會把這一行讀成 O(一個已結束的字串)後接一個未結束的識別字,這是語法錯誤而非成功的查詢。加引號工具中的 SQL 預設會將單引號重複,產生 'O''Brien',這是 PostgreSQL 詞彙結構參考文件所記載的形式,SQLite 和 ISO SQL 標準也使用相同的做法。
一行包含 she said "hi" 的內容放在單引號內看起來沒問題:'she said "hi"'。如果放入 JSON 字串常值中,解析器會讀到第一個雙引號為止就停止,並回報語法錯誤。JSON 預設會將內嵌的引號以反斜線跳脫,產生 "she said \"hi\"",這正是 RFC 8259 所要求的格式。
包含反斜線的一行在各預設中的處理方式也不同。JSON 會將其重複,因此單一反斜線變成 \\。CSV 完全不解讀反斜線,因此單一反斜線保持為單一反斜線。標準 SQL 在字串常值中也不解讀反斜線,因此單一反斜線保持為單一反斜線。在 Notepad++ 中撰寫的正規表達式並不知道目的地格式預期的是上述哪一條規則;而一個預設值對應到相關標準的加引號工具則會知道。
針對雜亂清單進行微調
每個預設也會個別顯示其控制項,這在資料不完全符合預設行為時很重要。
一個常見的情況是清單中包含空行——來自來源試算表的空列,或是同事為了可讀性而貼上的分隔線。啟用「跳過空行」切換會在包覆引號之前先移除這些行,這樣輸出的陣列或 IN 子句就不會包含會破壞後續程式碼的空字串項目。
第二種情況是每一行內部的空白。如果原始清單是從聊天視窗複製貼上而來,每一行可能帶有尾端空白或開頭的定位字元。啟用「每行去除空白」切換會在加引號之前先去除這些空白,使 " item1 " 變成 "item1",而不是在包覆的字串內部保留空格的 " item1 "。
第三種情況是結尾分隔符。JSON 陣列和 SQL IN 子句在大多數情況下不允許結尾逗號,因此此切換預設為關閉,最後一行會以乾淨的形式輸出。某些目標——傳遞給 shell 指令的清單、允許結尾分隔符的 CSV 變體、期望每行一個項目且每行結尾加上分號的設定檔——確實需要結尾分隔符,此時切換可以將其開啟。
結果列會顯示已處理的行數,對於非常長的清單來說是一個有用的健全性檢查。
Common Pitfalls When Quoting a Long List
The most common pitfall is quoting a list before cleaning it. If the same item appears twice, the quoting tool wraps it twice and the output JSON array or SQL IN clause contains a duplicate, which silently changes query results in SQL and silently bloats the data in JSON. Running the list through a duplicate-line remover first keeps the list unique before quoting, and the two tools together form a clean two-step workflow that matches what most developers already do by hand.
A second pitfall is re-running the tool on its own output. The tool cannot tell whether a quote character in the input is content or previous wrapping, so a second pass wraps the already-wrapped lines again, producing output like ""item1"", ""item2"" rather than "item1", "item2". If the quoting preset needs to change, start from the original unquoted list rather than from the previous output.
A third pitfall is hitting the input limit. The tool accepts up to one million characters in a single linear pass, which is enough for roughly 100,000 short IDs or names per paste; anything larger needs to be split first. Lists that big are rare, but they do happen when copying entire SQL result sets out of a query console.
A fourth pitfall is using the tool on a list whose values themselves contain line breaks. The tool processes one input line at a time, so a value that contains a newline will be split, and the embedded break will end up wrapped in quotes separately. For data that contains embedded line breaks — multiline descriptions, JSON values, log entries — clean those first or split the list by record before quoting.
Browser-Side Processing for Sensitive Lists
For many lists the source is sensitive: customer IDs, employee names, internal allowlists, environment configuration values. The Add Quotes to Each Line tool runs entirely in the browser; the input is never uploaded, never stored, and never attached to an account, so the data stays on the local machine throughout the round trip. The clipboard is the only boundary the data crosses, and that is the same boundary Notepad++ already uses when copying and pasting between documents.
This makes the tool usable for production data, test fixtures, and anything that needs to land in a real query or config file rather than a throwaway example. Processing happens in a single linear pass, so even lists of tens of thousands of items return the result without a perceptible delay.