若要在 Notepad++ 中移除空白字元,請使用 Ctrl+H 開啟「取代」對話框,啟用「使用規則運算式」模式,然後執行對應到你想要移除之空白類型的樣式 —— `\s+` 可匹配任何連續空白、`^\s+|\s+$` 處理行尾、`^\s+` 處理行首,或 `(?m)^\s*$` 處理空行。每個規則運算式配方解決的問題略有不同,搞混它們正是人們最後得到擠壓成一團的程式碼或黏在一起的文字的原因。Notepad++ 內建的規則運算式引擎不需外掛就能處理這四種工作,但權衡在於結果完全取決於你輸入的樣式以及勾選了哪些選項。這種模糊性正是許多讀者在多次取代失敗後來到這裡的原因:程式執行了,對話框顯示「已取代 X 個位置」,但文件看起來仍然不對。較安全的做法是在執行任何動作之前,明確指定你想移除的空白類型,並透過計數而非目視來驗證輸出。一個提供三種標示清楚之轉換方式的瀏覽器型清理工具,能讓同樣的概念在第一次就更容易做對。

how to remove whitespace in notepad++
如何在 Notepad++ 中移除空白字元而不破壞內容

Notepad++ 中各類空白字元的作用

Notepad++ 將空白視為幾種行為不同的獨立字元。在選擇規則運算式之前,了解你針對的是哪一種類型會有所幫助,因為錯誤的樣式會對你真正在意的那部分檔案默默執行錯誤的操作。

一般空格 (U+0020) 是最常見的字元,也是大多數讀者所說的「空白」。Tab (U+0009) 在螢幕上看起來像空格,但它是獨立的字元;而不斷行空格 (U+00A0) 對一般讀者來說是隱形的,通常是「看起來沒問題但無法排序」這類文字的元凶。換行本身也有其特殊性:Windows 檔案使用 CRLF (`\r\n`)、Unix 檔案使用 LF (`\n`),而舊版 Mac 檔案單獨使用 CR (`\r`)。當你在同一份文件中混用其中兩種慣例時,可見的結果看起來正常,但下游工具可能會被多餘的歸位字元卡住。

以下是最常見 Notepad++ 工作的快速配方表。請在「取代」對話框 (Ctrl+H) 中執行這些操作,並勾選「使用規則運算式」模式。除非另有說明,「取代成」欄位保持空白。

目標 尋找樣式 取代成 需注意的副作用
將連續的水平空白壓縮為一個空格 \h+ 一個空格 不會影響換行
移除每行行首的空格與 Tab ^\h+ (空白) 已縮排的原始碼會變成無效
移除每行行尾的空格與 Tab \h+$ (空白) 行尾空白通常代表編輯未完成
移除所有空白行或僅含空白的行 (?m)^\s*$ (空白) 每次匹配會留下一個空白行;請執行兩次
移除所有空白字元,包括換行 \s+ (空白) 將所有字詞與行合併成一個區塊

請注意,Notepad++ 中的 `\h` 僅匹配水平空白 (空格與 Tab),當你想保留段落分行時,這比 `\s` 更安全。`\s` 會匹配任何空白,包括換行,因此一個不小心的 `\s+` 取代作業,是讀者將文件壓平成一行無法閱讀的文字、並失去原本想保留之段落的最常見原因。

在瀏覽器中以三種模式完成同一項工作

前一節中的五個規則運算式配方,幾乎一對一對應到瀏覽器型 Whitespace Remover 中的三種模式,值得你在工作時於另一個分頁中開啟。Notepad++ 仰賴你輸入正確的樣式並記住每個字元類別實際匹配什麼,而這個工具以淺顯的英文標示其模式,並在輸出旁顯示已移除之程式碼單位的計數,讓你一眼就能確認變更。

這三種模式是刻意區分而非重疊的,每一種都圍繞著特定的工作建構:

模式 移除的內容 適用的時機
壓縮水平空白 每行中連續的空格與 Tab、換行旁的空格,並將 CRLF 正規化為 LF;結果會進行修剪 散文、段落、部落格文章與電子郵件草稿
修剪行並移除空白行 每行開頭與結尾的空白,接著移除變成空白的行;以單一 LF 重新連接 清單、複製的表格、記錄檔摘錄以及貼上的筆記
移除所有空白字元 任何符合 JavaScript 之 Unicode 感知空白類別的字元,包括不斷行空格 緊湊的符記壓縮、機器輸入、單行 ID

如果你覺得上方的規則運算式表需要記住的內容太多,這個工具就是同一概念的簡化版本。貼上你的文字,挑選符合你下游格式的模式,結果面板就會回報從你所提供之輸入中移除了多少個 JavaScript UTF-16 程式碼單位。

使用 Whitespace Remover 清理空白

開啟 Whitespace Remover,並執行以下四個步驟,在不手寫規則運算式的情況下清理一段貼上的文字。

  1. 將你想清理的純文字貼上或輸入到輸入區域。文字會保留在你的瀏覽器分頁中,不會上傳到任何伺服器。
  2. 挑選符合你目標的模式:散文請選「壓縮水平空白」、清單請選「修剪行並移除空白行」、緊湊的符記則選「移除所有空白字元」。
  3. 選擇「清理文字」。工具會在本地端執行轉換,並在顯示完整輸出的同時,一併顯示已移除之程式碼單位的數量。
  4. 檢視輸出、確認計數符合預期,然後將結果複製到剪貼簿。如果瀏覽器封鎖剪貼簿權限,頁面會顯示提示,並讓唯讀結果保持可見以便手動選取。

結果面板所回報的已移除程式碼單位數量,是輸入長度與輸出長度之間的差值。對於完全相同的輸入字串與所選的模式而言,該數字是確定性的:以相同的模式貼上相同的文字兩次,你會得到相同的字串,這項特性讓你能將計數視為一種驗證依據,而非猜測。

計算程式碼單位與可見字元的差異

工具所回報的計數是 JavaScript UTF-16 程式碼單位,而非位元組、字素或字詞計數。對於純 ASCII 文字,這三個數字通常一致,但對於表情符號、附加符號字母以及 CJK 字元,它們可能會出現落差。相同的輸入與相同的模式永遠會產生相同的字串,因此輸入長度與輸出長度之間的差值是一個你可以信賴的穩定數字,當你想確認轉換確實如你所要求地執行時,這點很有用。

一個簡短的逐步示例說明了計數在實務上的意義。以輸入字串 " Hello World " 為例,其輸入長度為 18 個 UTF-16 程式碼單位。使用「壓縮水平空白」模式時,開頭的 2 個空格與結尾的 2 個空格會從完整結果中修剪掉,內部連續的 4 個空格則會被壓縮為 1 個。輸出為 "Hello World",輸出長度為 11,因此工具會回報移除了 7 個程式碼單位 (18 減去 11)。這個數字是確定性的:將相同的字串以相同的模式貼上,每次都會得到具有相同程式碼單位計數的相同輸出。

表情符號與某些歷史文字腳本中,每個可見字元可能使用一個以上的 UTF-16 程式碼單位,因此一個視覺上看起來較長的表情符號字串,仍可能回報比視覺上看起來較短的 ASCII 字串更小的移除計數。工具並不會假裝情況相反;該計數永遠是輸入與輸出之 JavaScript 字串長度的精確值。

每種模式的適用之處與陷阱

每一種模式的存在,都是因為它能妥善完成某項真實的工作,也會徹底毀掉另一項工作。最安全的搭配是:任何將由人類閱讀的內容 (段落、部落格草稿、電子郵件回覆、產品描述) 都使用「壓縮水平空白」。它會保留換行,因此段落保持分隔,並會將 CRLF 正規化為 LF,使清理後的輸出在 Windows、macOS 與 Linux 上的行為一致。

「修剪行並移除空白行」是清單、複製的表格、記錄檔摘錄,以及任何不應帶有多餘縮排之情境的正確選擇。該模式明確表示不會觸及內部間距,因此非空行內部的字詞會保持你輸入時的樣貌。當你從 PDF 或主控台貼上內容、並希望各項目能整齊排列而無需手動清理時,請使用此模式。

「移除所有空白字元」是破壞性最強的模式,這個稱號實至名歸,因為它會將原本分開的字詞黏合在一起。它適用於符記與受到嚴格控制的機器輸入,例如串接的 ID、單行金鑰,或是必須容納於單行的 CSV 值。但它不適用於散文、程式碼、YAML,或任何空格具有意義的內容。如果你面對的唯一問題是換行,相關的 如何在 Notepad++ 中移除換行而不犯規則運算式錯誤 指南提供了更聚焦的選項,僅針對換行進行處理而不影響其他空白。

對於原始碼、法律文字、詩歌、固定寬度資料、YAML、Python,或是任何縮排與行尾符號具有意義的語法,請仔細預覽結果,或改用具備格式感知的編輯器。空白可以是資料,而這正是需要牢記的情境。這個頁面將最終選擇權保留給使用者,而不是默默破壞版面配置。

Why a Browser Cleaner Is Safer for Sensitive Text

If the document you are cleaning includes names, emails, internal notes, or anything else you would not paste into a random web form, the local-only path is worth taking. The Whitespace Remover runs the transformation in the current browser tab, which means the input text, the chosen mode, and the result never leave your machine. The result panel is read-only and shows the exact string that was produced, and the clipboard copy is a convenience rather than a hidden dependency: when the browser grants permission the tool confirms the copy, and when permission is blocked the page reports that condition and leaves the full result visible for manual selection.

The transformation is deterministic, which means the same input and the same mode always produce the same string. There is no AI rewriting, no spelling correction, no smart-quote conversion, and no automatic Markdown or HTML parsing. If the input contains non-breaking spaces, tabs, CRLF line endings, or any other character matched by JavaScript's Unicode-aware whitespace class, the relevant mode will treat them the way the regex expects; if the input does not contain them, nothing happens to that part of the text. The Unicode-aware behavior follows the rules documented in MDN's character class escapes reference, and the underlying replace operation follows the rules in MDN's String.replace reference, which keeps the behavior predictable across runs and across browsers.

For very large files, paste in chunks so the result panel stays easy to read. For any input you cannot afford to misread, change the mode and watch the output panel reset before you copy: the tool clears stale output when you change the input or the mode, which is the small detail that stops a copied result from being mistaken for the current settings.

For a deeper look, see Remove Word Wrap and Re-wrap at a New Column Width.