在 Notepad++ 中,使用尋找和取代為每行加上引號會將每一行包裹成 `"$1"`,但只要某一行包含引號、反斜線,或是目標格式會特殊處理的內容,同樣的正規表示式就會悄悄失效。從聊天視窗貼上的五十個 ID 列表,只有在每個內嵌的雙引號都以反斜線跳脫後才能成為 JSON 陣列;只有每個內嵌的單引號都加倍後才能成為 SQL IN 子句;也只有每個內嵌的雙引號都再次加倍後才能成為 CSV 資料列。這三條規則各不相同,而這些差異記載於各格式所引用的標準中,單次正規表示式的處理無法同時滿足這三項需求。為每行加上引號 工具能針對每種格式套用正確的規則,只需一次點擊,完全在瀏覽器中執行,並可在單次處理中處理多達一百萬個字元。

add quotes to each line in notepad ++
add quotes to each line in notepad ++

為何 Notepad++ 的尋找和取代在真實列表上會失效

常見的技巧是將搜尋模式切換為「規則運算式」,然後把 `^` 取代為 `"`,把 `$` 取代為 `"`,或是使用單一模式如 `^(.*)$`,搭配取代內容 `"$1"`。這在乾淨的純文字清單上可以正常運作,前提是其中不含內嵌引號、沒有會影響內容的逗號,也不必清理行首或行尾的空白。一旦你的列表中出現像 `say "hi"` 這樣的值、名稱剛好是 `O'Reilly` 的值,或是 CSV 欄位內部含有逗號,包裹後的輸出就不再是合法的 JSON、SQL 或 CSV — 只是看起來像是合法而已。

Notepad++ 的正規表示式引擎並不了解「這段文字即將放進 JSON 字串」或「這段文字即將放進 SQL 字面值」這類語境。它將輸入視為文字、輸出也視為文字。這對文字編輯器而言是正確的行為,但也正是當目標格式擁有各自的跳脫規則時,不能把包裹工作交給正規表示式的原因。解法是在包裹之後套用這些規則,而這正是專用引號工具在各預設中所做的事。

如果你的列表已經是乾淨的 — 沒有引號、沒有會造成問題的逗號、也沒有行首或行尾空白 — Notepad++ 的正規表示式仍然有效,此時工具就顯得多餘。除此之外,這兩者的差異就在於輸出是否能通過編譯,或只會產生 `SyntaxError`、SQL 語法錯誤,或是在匯入時讓 CSV 欄位移到錯誤的儲存格。

每種格式默默要求的跳脫規則

這三個常見目標對內嵌引號字元的處理方式各不相同,這些規則是由已發布的標準所規定,而非出於慣例:

格式包裹字元內嵌引號會變成來源
JSON 陣列"\" (反斜線 + 雙引號)RFC 8259
SQL IN 子句''' (單引號加倍)PostgreSQL、SQLite、ISO SQL
CSV 資料列""" (雙引號加倍)RFC 4180

因此,內容為 `she said "hi"` 的一行,在 JSON 中會變成 `"she said \"hi\""`,在 SQL 中會變成 `'she said "hi"'`(由於以單引號包裹,內嵌的雙引號不需要跳脫),而在 CSV 中則會變成 `"she said ""hi"""`。同一段輸入,三種不同的正確輸出。根據 RFC 4180,任何包含分隔符、雙引號或換行的欄位都必須以雙引號包裹,內嵌的雙引號則以多加一個雙引號的方式跳脫。根據 PostgreSQL 詞彙結構文件,字串常數以單引號界定,字面值內部的任何單引號都必須寫兩次 — 而非在其前加上反斜線,因為反斜線保留作為其他用途的跳脫。

如何在 Notepad++ 中為每行加上引號

整個流程讓你留在 Notepad++ 進行編輯,只有加上引號這一步會交給懂得每種格式跳脫規則的工具來處理。所有過程中都不會上傳任何資料。

  1. 在 Notepad++ 中,選取你想要包裹的行;如果整份檔案就是該列表,也可以直接將游標留在任何位置。按下 Ctrl+A 全選,再按 Ctrl+C 複製。
  2. 在新分頁中開啟「為每行加上引號」工具。使用 Ctrl+V 將列表貼到輸入欄位;每個項目應各佔一行。
  3. 選擇與輸出目的相符的預設:JSON 陣列 用於 `[ ... ]` 字面值,SQL IN 子句 用於 WHERE ... IN 中的 `( ... )` 列表,CSV 資料列 用於單列匯入,或在只需要包裹而不附加任何語法結構時選擇 純引號
  4. 如果預設設定不符合你的需求,可調整引號字元、分隔符(預設為逗號)、是否在最後一行加上結尾分隔符、是否跳脫內嵌引號,以及是否略過空行或先修剪每一行。
  5. 在結果面板上點擊 複製。結果會顯示已處理了多少行,方便你與原始列表的數量進行核對。
  6. 回到 Notepad++ 中,將游標放在引號區塊應插入的位置,按 Ctrl+V 貼上。如果結果是要給其他用途,請切換到該分頁再貼上。

整個加上引號的步驟只需花費幾秒鐘;它的價值在於輸出可以直接貼上使用,而不需要你為了某個跳脫錯誤再手動修改。

預設能做到而手寫正規表示式做不到的事

除了依照格式進行跳脫之外,預設還會補上目標格式所期待的外圍標點。JSON 預設會以方括號包裹列表並以逗號連接項目,最後一項不留結尾逗號,讓陣列在語法上合法。SQL 預設會以小括號包裹列表並以逗號連接,同樣不留結尾逗號。CSV 預設則輸出一列以逗號分隔、以雙引號包裹的欄位,不含任何外圍括號。至於只需要包裹的情境,則有純引號預設可供使用。

在實務上有三個行為值得注意:

  • 預設不加上結尾分隔符。在 JSON 和大多數 SQL 方言中,最後一個項目之後加上逗號會導致語法錯誤,因此預設會保持最後一行的乾淨。當目標格式需要結尾分隔符時,可透過開關來加上。
  • 可以略過空行,也可以修剪每一行。從聊天視窗複製的列表常常帶有行尾空白或空白分隔行;這兩者都有對應的開關,讓輸出保持整潔。
  • 跳脫步驟本身也是一個開關。如果你想要純粹的包裹而不做任何字元解讀 — 例如在產生測試資料、希望內容中保留原始引號時 — 關閉跳脫即可達到該效果。

有一個行為是明白記載的,而不是隱藏的:對工具本身的輸出再次執行,會把引號再包裹一層,因為引號工具無法判斷既有的引號究竟是內容還是包裹。如果需要不同的設定,請從原始列表重新開始,而不是對上一次的結果再執行一次。

在複製之前值得了解的設定

預設是一個起點,而同一個工具在需要時也提供了個別的控制選項。引號樣式涵蓋單引號、雙引號、反引號(用於 JavaScript 樣板字面值)或無;分隔符可以設定是否在最後一行加上結尾分隔符;跳脫功能可依格式單獨開啟或關閉;略過空行與逐行修剪則是彼此獨立的開關。

反引號樣式值得特別說明:它是設計給 JavaScript 樣板字面值使用,其實作會跳脫反引號以及內插運算式的起始符號,使貼上的內容無法將運算式插入外圍的樣板中。其他樣式則不需要這個步驟。

所有處理都在瀏覽器中於本機執行。輸入上限為一百萬個字元,並以單一線性處理完成,即使是非常長的列表也能快速回傳。你的資料 — 往往正是那種你最不想隨意貼到陌生網站的 ID 列表或姓名列表 — 永遠不會被上傳、儲存或綁定到任何帳號。這使得此工具特別適合那些最需要加上引號的列表 — 正式環境的 ID、客戶姓名、白名單與功能旗標 — 因為在這些情境下,將資料貼到第三方 API 是錯誤的選擇。

如果你在加上引號之前還需要先清理列表(去除重複、刪除空行,或依照特定順序排序),工作流程也是一樣的:先使用相關工具清理列表,再回到這裡進行加上引號的步驟。加上引號的工具假設輸入就是要被包裹的列表,並不會自動去除重複或排序。

如果你正在權衡各種選擇,為每行加上前綴:4 個真實案例 對此有詳細說明。

如果你正在權衡各種選擇,如何移除 Word 文件中的換行 對此有詳細說明。